@fonsecabarreto/genesis-gl-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/dist/Camera-DY_8gx3C.d.ts +45 -0
  4. package/dist/Core/classes/Material.d.ts +3 -0
  5. package/dist/Core/classes/Material.js +9 -0
  6. package/dist/Core/classes/Material.js.map +1 -0
  7. package/dist/Core/classes/Model.d.ts +5 -0
  8. package/dist/Core/classes/Model.js +7 -0
  9. package/dist/Core/classes/Model.js.map +1 -0
  10. package/dist/Core/classes/Renderer.d.ts +30 -0
  11. package/dist/Core/classes/Renderer.js +11 -0
  12. package/dist/Core/classes/Renderer.js.map +1 -0
  13. package/dist/Core/classes/Scene.d.ts +37 -0
  14. package/dist/Core/classes/Scene.js +7 -0
  15. package/dist/Core/classes/Scene.js.map +1 -0
  16. package/dist/Core/classes/Viewport.d.ts +37 -0
  17. package/dist/Core/classes/Viewport.js +7 -0
  18. package/dist/Core/classes/Viewport.js.map +1 -0
  19. package/dist/Core/domain/interfaces/Vectors.d.ts +4 -0
  20. package/dist/Core/domain/interfaces/Vectors.js +1 -0
  21. package/dist/Core/domain/interfaces/Vectors.js.map +1 -0
  22. package/dist/Core/index.d.ts +10 -0
  23. package/dist/Core/index.js +51 -0
  24. package/dist/Core/index.js.map +1 -0
  25. package/dist/Core/utils/get-overlap.d.ts +3 -0
  26. package/dist/Core/utils/get-overlap.js +11 -0
  27. package/dist/Core/utils/get-overlap.js.map +1 -0
  28. package/dist/Core/utils/load-glb.d.ts +101 -0
  29. package/dist/Core/utils/load-glb.js +697 -0
  30. package/dist/Core/utils/load-glb.js.map +1 -0
  31. package/dist/Core/utils/parse-obj.d.ts +10 -0
  32. package/dist/Core/utils/parse-obj.js +183 -0
  33. package/dist/Core/utils/parse-obj.js.map +1 -0
  34. package/dist/Editor/index.d.ts +364 -0
  35. package/dist/Editor/index.js +1737 -0
  36. package/dist/Editor/index.js.map +1 -0
  37. package/dist/Game/controls/KeyboardInput.d.ts +8 -0
  38. package/dist/Game/controls/KeyboardInput.js +7 -0
  39. package/dist/Game/controls/KeyboardInput.js.map +1 -0
  40. package/dist/Game/index.d.ts +45 -0
  41. package/dist/Game/index.js +353 -0
  42. package/dist/Game/index.js.map +1 -0
  43. package/dist/KeyboardControl-5w7Vm0J0.d.ts +18 -0
  44. package/dist/KeyboardInput-DTsfj3tE.d.ts +166 -0
  45. package/dist/Material-BGLkldxv.d.ts +74 -0
  46. package/dist/Model-CQvDXd-b.d.ts +302 -0
  47. package/dist/WebGLCore-DR7ZHJB0.d.ts +22 -0
  48. package/dist/chunk-3ULETMWF.js +144 -0
  49. package/dist/chunk-3ULETMWF.js.map +1 -0
  50. package/dist/chunk-5TAAXI6S.js +330 -0
  51. package/dist/chunk-5TAAXI6S.js.map +1 -0
  52. package/dist/chunk-6LS6AO5H.js +296 -0
  53. package/dist/chunk-6LS6AO5H.js.map +1 -0
  54. package/dist/chunk-JK2HEZAT.js +317 -0
  55. package/dist/chunk-JK2HEZAT.js.map +1 -0
  56. package/dist/chunk-P7QOKDLY.js +57 -0
  57. package/dist/chunk-P7QOKDLY.js.map +1 -0
  58. package/dist/chunk-QCQVJCSR.js +968 -0
  59. package/dist/chunk-QCQVJCSR.js.map +1 -0
  60. package/dist/chunk-SUNYSY45.js +81 -0
  61. package/dist/chunk-SUNYSY45.js.map +1 -0
  62. package/package.json +83 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Core/classes/Renderer.ts","../src/Core/utils/compute-bounds.ts","../src/Core/classes/Mesh.ts","../src/Core/shaders/index.ts","../src/Core/classes/WebGLCore.ts","../src/Core/classes/Skeleton.ts","../src/Core/classes/AnimationClip.ts","../src/Core/utils/create-wire-box.ts"],"sourcesContent":["import { mat4, vec3 } from 'gl-matrix';\nimport { Material, Mesh, Scene, WebGLCore } from '.';\nimport { Viewport } from './Viewport';\nimport { Light } from './Light';\nimport { Vector3 } from '../domain/interfaces/Vectors';\nimport { Model } from './Model';\nimport { Skeleton } from './Skeleton';\nimport { createWireBox } from '../utils/create-wire-box';\n\nconst computeModelMatrix = (model: Model): mat4 => {\n const m = mat4.create();\n mat4.translate(m, m, model.translation);\n mat4.rotateX(m, m, model.rotation[0]);\n mat4.rotateY(m, m, model.rotation[1]);\n mat4.rotateZ(m, m, model.rotation[2]);\n mat4.scale(m, m, model.scale);\n return m;\n};\n\nexport class Renderer {\n /** Set to `true` to render wireframe bounding boxes for debugging. */\n public debug = false;\n\n // Cached debug materials to avoid per-frame GPU allocations\n private _modelHitboxMaterial: Material | null = null;\n private _meshHitboxMaterial: Material | null = null;\n\n constructor(\n private webglCore: WebGLCore,\n public viewport: Viewport,\n ) {}\n\n /** Lazily-created material for model-level hitboxes (red). */\n private get modelHitboxMaterial(): Material {\n if (!this._modelHitboxMaterial) {\n this._modelHitboxMaterial = new Material(this.webglCore);\n this._modelHitboxMaterial.setColorHex('#ff0404ff');\n this._modelHitboxMaterial.unlit = true;\n }\n return this._modelHitboxMaterial;\n }\n\n /** Lazily-created material for mesh-level hitboxes (green). */\n private get meshHitboxMaterial(): Material {\n if (!this._meshHitboxMaterial) {\n this._meshHitboxMaterial = new Material(this.webglCore);\n this._meshHitboxMaterial.setColorHex('#04ff0cff');\n this._meshHitboxMaterial.unlit = true;\n }\n return this._meshHitboxMaterial;\n }\n\n public clearFrame(\n color: [number, number, number, number] = [0.2, 0.5, 0.95, 1],\n ) {\n const gl = this.webglCore.getRenderingContext();\n if (!gl) return;\n\n gl.clearColor(...color);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.DEPTH_TEST);\n }\n\n public render(scene: Scene) {\n const gl = this.webglCore.getRenderingContext();\n if (!gl) return;\n\n const models = scene.getModels();\n const lights = scene.getLights();\n const camera = this.viewport.camera;\n\n const viewPosition: vec3 = camera.getComputedPosition();\n this.clearFrame();\n\n const viewMatrix = camera.getViewMatrix() as Float32Array;\n const projMatrix = camera.getProjectionMatrix() as Float32Array;\n\n const activeProgram: WebGLProgram | null = null;\n\n for (const model of models) {\n this.drawModel(\n gl,\n model,\n lights,\n viewPosition,\n viewMatrix,\n projMatrix,\n activeProgram,\n );\n }\n }\n\n private drawModel(\n gl: WebGLRenderingContext,\n model: Model,\n lights: Light[],\n viewPosition: vec3,\n viewMatrix: Float32Array,\n projMatrix: Float32Array,\n activeProgram: WebGLProgram | null,\n ) {\n const modelMatrix = computeModelMatrix(model);\n const hasSkeleton = model.skeleton !== null;\n\n for (const mesh of model.meshes) {\n activeProgram = this.drawMesh(\n mesh,\n lights,\n viewPosition,\n modelMatrix,\n viewMatrix,\n projMatrix,\n activeProgram,\n hasSkeleton && mesh.isSkinned ? model : null,\n );\n\n if (this.debug) {\n this.drawHitBoxForMesh(\n mesh,\n modelMatrix,\n viewMatrix,\n projMatrix,\n activeProgram,\n );\n }\n }\n\n // Debug wireframe\n if (this.debug) {\n this.drawHitBox(model, modelMatrix, activeProgram);\n }\n }\n\n private drawMesh(\n mesh: Mesh,\n lights: Light[],\n viewPosition: vec3,\n modelMatrix: mat4,\n viewMatrix: Float32Array,\n projMatrix: Float32Array,\n activeProgram: WebGLProgram | null,\n skinnedModel: Model | null = null,\n ): WebGLProgram | null {\n const gl = this.webglCore.getRenderingContext();\n if (!gl) return activeProgram;\n if (!mesh.material) return activeProgram;\n\n mesh.initBuffer(this.webglCore);\n\n const { program, uniformLocations } = mesh.material;\n\n if (program !== activeProgram) {\n gl.useProgram(program);\n activeProgram = program;\n\n if (uniformLocations['uView'])\n gl.uniformMatrix4fv(uniformLocations['uView'], false, viewMatrix);\n if (uniformLocations['uProjection'])\n gl.uniformMatrix4fv(uniformLocations['uProjection'], false, projMatrix);\n }\n\n // Detect WebGL2\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n\n // --- Bind VAO if available ---\n if (isWebGL2 && mesh.buffers?.vao) {\n (gl as unknown as WebGL2RenderingContext).bindVertexArray(\n mesh.buffers.vao,\n );\n } else {\n // --- WebGL1 Fallback ---\n const aPosition = mesh.material.attribLocations['aPosition'];\n if (aPosition !== -1 && mesh.buffers?.vertexBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.vertexBuffer);\n gl.enableVertexAttribArray(aPosition);\n gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);\n }\n\n const aNormal = mesh.material.attribLocations['aNormal'];\n if (aNormal !== -1 && mesh.buffers?.normalBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.normalBuffer);\n gl.enableVertexAttribArray(aNormal);\n gl.vertexAttribPointer(aNormal, 3, gl.FLOAT, false, 0, 0);\n }\n\n const aTexCoord = mesh.material.attribLocations['aTexCoord'];\n if (aTexCoord !== -1 && mesh.buffers?.texCoordBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.texCoordBuffer);\n gl.enableVertexAttribArray(aTexCoord);\n gl.vertexAttribPointer(aTexCoord, 2, gl.FLOAT, false, 0, 0);\n }\n\n // Skinning attributes (joint indices + weights)\n const aJointIndices = mesh.material.attribLocations['aJointIndices'];\n if (aJointIndices !== -1 && mesh.buffers?.jointIndexBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.jointIndexBuffer);\n gl.enableVertexAttribArray(aJointIndices);\n gl.vertexAttribPointer(aJointIndices, 4, gl.FLOAT, false, 0, 0);\n }\n\n const aJointWeights = mesh.material.attribLocations['aJointWeights'];\n if (aJointWeights !== -1 && mesh.buffers?.jointWeightBuffer) {\n gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.jointWeightBuffer);\n gl.enableVertexAttribArray(aJointWeights);\n gl.vertexAttribPointer(aJointWeights, 4, gl.FLOAT, false, 0, 0);\n }\n }\n\n // Material uniforms\n mesh.material.apply(gl, lights, viewPosition as Vector3);\n\n // ── Skinning uniforms ─────────────────────────────────────\n const uUseSkinning = uniformLocations['uUseSkinning'];\n const skeleton: Skeleton | null =\n (skinnedModel?.skeleton as Skeleton | undefined) ?? null;\n if (skeleton && mesh.isSkinned) {\n if (uUseSkinning) gl.uniform1i(uUseSkinning, 1);\n const uJointMatrices = uniformLocations['uJointMatrices[0]'];\n if (uJointMatrices) {\n gl.uniformMatrix4fv(uJointMatrices, false, skeleton.jointMatrices);\n }\n } else {\n if (uUseSkinning) gl.uniform1i(uUseSkinning, 0);\n }\n\n // Model transform\n const uModel = mesh.material.uniformLocations['uModel'];\n if (uModel) gl.uniformMatrix4fv(uModel, false, modelMatrix as Float32Array);\n\n // Draw\n if (mesh.buffers?.indexBuffer && mesh.indices) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, mesh.buffers.indexBuffer);\n const type =\n mesh.indices instanceof Uint32Array\n ? gl.UNSIGNED_INT\n : gl.UNSIGNED_SHORT;\n gl.drawElements(mesh.mode, mesh.indices.length, type, 0);\n } else {\n gl.drawArrays(mesh.mode, 0, mesh.vertices.length / 3);\n }\n\n // Cleanup\n if (isWebGL2 && mesh.buffers?.vao) {\n (gl as unknown as WebGL2RenderingContext).bindVertexArray(null);\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n }\n\n return activeProgram;\n }\n\n public drawHitBox(\n model: Model,\n modelMatrix: mat4,\n activeProgram: WebGLProgram | null,\n ) {\n // Use bounding box directly — already in world coordinates\n const hitboxMesh = createWireBox(\n model.boundingBox.min,\n model.boundingBox.max,\n this.modelHitboxMaterial,\n );\n hitboxMesh.isCollidable = false;\n\n const camera = this.viewport.camera;\n const viewMatrix = camera.getViewMatrix() as Float32Array;\n const projMatrix = camera.getProjectionMatrix() as Float32Array;\n\n const identity = mat4.create();\n\n this.drawMesh(\n hitboxMesh,\n [],\n camera.position,\n identity,\n viewMatrix,\n projMatrix,\n activeProgram,\n );\n }\n\n private drawHitBoxForMesh(\n mesh: Mesh,\n modelMatrix: mat4,\n viewMatrix: Float32Array,\n projMatrix: Float32Array,\n activeProgram: WebGLProgram | null,\n ) {\n const gl = this.webglCore.getRenderingContext();\n if (!gl || !mesh.boundingBox) return;\n\n const { min, max } = mesh.boundingBox;\n\n const wireBox = createWireBox(min, max, this.meshHitboxMaterial);\n wireBox.isCollidable = false;\n\n const camera = this.viewport.camera;\n this.drawMesh(\n wireBox,\n [],\n camera.position,\n modelMatrix,\n viewMatrix,\n projMatrix,\n activeProgram,\n );\n }\n}\n","import { AABB } from '../domain/value-objects/Collider';\n\n/**\n * Compute the axis-aligned bounding box (AABB) from a flat Float32Array of vertices.\n * Each vertex is expected to be 3 consecutive floats: [x, y, z, ...].\n */\nexport function computeVertexBounds(vertices: Float32Array): AABB {\n if (!vertices || vertices.length === 0) {\n return { min: [0, 0, 0], max: [0, 0, 0] };\n }\n\n let minX = Infinity,\n minY = Infinity,\n minZ = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity,\n maxZ = -Infinity;\n\n for (let i = 0; i < vertices.length; i += 3) {\n const x = vertices[i];\n const y = vertices[i + 1];\n const z = vertices[i + 2];\n\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (z < minZ) minZ = z;\n\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n if (z > maxZ) maxZ = z;\n }\n\n return {\n min: [minX, minY, minZ],\n max: [maxX, maxY, maxZ],\n };\n}\n","import WebGLCore from './WebGLCore';\nimport { Material } from './Material';\nimport { AABB } from '../domain/value-objects/Collider';\nimport { computeVertexBounds } from '../utils/compute-bounds';\n\n/** WebGL draw-mode constants. */\nexport const GL_LINES = 0x0001;\nexport const GL_TRIANGLES = 0x0004;\n\nexport const INITIAL_BOUNDING_BOX: AABB = { min: [0, 0, 0], max: [0, 0, 0] };\n\n/**\n * A single renderable mesh: vertex data, normals, indices, a material, and an\n * optional bounding box used for collision detection.\n *\n * For skinned meshes, set {@link jointIndices} and {@link jointWeights} to\n * enable GPU skeletal animation.\n */\nexport class Mesh {\n name: string;\n\n vertices: Float32Array;\n\n normals: Float32Array;\n\n texCoords: Float32Array;\n\n indices: Uint16Array | Uint32Array | null;\n\n mode: number;\n\n material: Material;\n\n // ── Skinning data (optional) ─────────────────────────────────\n /** Per-vertex joint indices (vec4 per vertex, 4 influences). */\n jointIndices: Float32Array | null = null;\n\n /** Per-vertex joint weights (vec4 per vertex, 4 influences). */\n jointWeights: Float32Array | null = null;\n\n // WebGL buffers aggregate\n buffers: MeshBuffers | null = null;\n\n boundingBox: AABB = INITIAL_BOUNDING_BOX;\n\n isCollidable = true;\n\n isInitialized = false;\n\n constructor(\n name: string,\n vertices: Float32Array,\n normals: Float32Array,\n material: Material,\n texCoords: Float32Array = new Float32Array(),\n indices: Uint16Array | Uint32Array | null = null,\n ) {\n this.mode = GL_TRIANGLES;\n this.name = name;\n this.normals = normals;\n this.indices = indices;\n this.vertices = vertices;\n this.texCoords = texCoords;\n this.material = material;\n\n this.computeBounds();\n }\n\n setMode(newMode: number) {\n this.mode = newMode;\n }\n\n /** Whether this mesh has skinning data for skeletal animation. */\n get isSkinned(): boolean {\n return this.jointIndices !== null && this.jointWeights !== null;\n }\n\n computeBounds() {\n this.boundingBox = computeVertexBounds(this.vertices);\n }\n\n clone(): Mesh {\n const clonedMesh = new Mesh(\n this.name,\n new Float32Array(this.vertices),\n new Float32Array(this.normals),\n this.material, // shallow ref — call Material.clone() if independent material is needed\n new Float32Array(this.texCoords),\n this.indices\n ? this.indices instanceof Uint16Array\n ? new Uint16Array(this.indices)\n : new Uint32Array(this.indices)\n : null,\n );\n clonedMesh.setMode(this.mode);\n clonedMesh.isCollidable = this.isCollidable;\n if (this.jointIndices)\n clonedMesh.jointIndices = new Float32Array(this.jointIndices);\n if (this.jointWeights)\n clonedMesh.jointWeights = new Float32Array(this.jointWeights);\n return clonedMesh;\n }\n\n /** Initialize GPU buffers safely */\n public initBuffer(webglCore: WebGLCore) {\n const gl = webglCore.getRenderingContext();\n\n if (!gl) {\n console.warn(\n `[Mesh:${this.name}] GL context not available, skipping buffer init.`,\n );\n return;\n }\n if (this.isInitialized) return;\n\n this.buffers = new MeshBuffers();\n this.buffers.init(gl as WebGL2RenderingContext, this);\n this.isInitialized = true;\n }\n\n /** Dispose of GPU buffers safely */\n public dispose(webglCore: WebGLCore) {\n const gl = webglCore.getRenderingContext();\n if (!gl || !this.buffers) return;\n\n this.buffers.dispose(gl as WebGL2RenderingContext);\n this.buffers = null;\n this.isInitialized = false;\n }\n}\n\nexport class MeshBuffers {\n vao: WebGLVertexArrayObject | null = null;\n vertexBuffer: WebGLBuffer | null = null;\n normalBuffer: WebGLBuffer | null = null;\n texCoordBuffer: WebGLBuffer | null = null;\n indexBuffer: WebGLBuffer | null = null;\n jointIndexBuffer: WebGLBuffer | null = null;\n jointWeightBuffer: WebGLBuffer | null = null;\n\n public init(gl: WebGLRenderingContext, mesh: Mesh) {\n if (!gl) throw new Error('Cannot init MeshBuffers: invalid GL context');\n\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n const gl2 = isWebGL2 ? (gl as unknown as WebGL2RenderingContext) : null;\n\n if (gl2) {\n this.vao = gl2.createVertexArray();\n gl2.bindVertexArray(this.vao);\n }\n\n // --- Attribute layout ---\n // Attribute locations must match the shader (aPosition=0, aNormal=1, aTexCoord=2).\n // Look them up from the mesh's material program so the VAO captures the bindings.\n const program = mesh.material?.program;\n const aPosition = program ? gl.getAttribLocation(program, 'aPosition') : 0;\n const aNormal = program ? gl.getAttribLocation(program, 'aNormal') : 1;\n const aTexCoord = program ? gl.getAttribLocation(program, 'aTexCoord') : 2;\n\n // Vertex buffer\n this.vertexBuffer = gl.createBuffer();\n if (!this.vertexBuffer) throw new Error('Failed to create vertex buffer');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, mesh.vertices, gl.STATIC_DRAW);\n if (aPosition !== -1) {\n gl.enableVertexAttribArray(aPosition);\n gl.vertexAttribPointer(aPosition, 3, gl.FLOAT, false, 0, 0);\n }\n\n // Normal buffer\n this.normalBuffer = gl.createBuffer();\n if (!this.normalBuffer) throw new Error('Failed to create normal buffer');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.normalBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, mesh.normals, gl.STATIC_DRAW);\n if (aNormal !== -1) {\n gl.enableVertexAttribArray(aNormal);\n gl.vertexAttribPointer(aNormal, 3, gl.FLOAT, false, 0, 0);\n }\n\n // TexCoord buffer\n if (mesh.texCoords.length > 0) {\n this.texCoordBuffer = gl.createBuffer();\n if (!this.texCoordBuffer)\n throw new Error('Failed to create texCoord buffer');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, mesh.texCoords, gl.STATIC_DRAW);\n if (aTexCoord !== -1) {\n gl.enableVertexAttribArray(aTexCoord);\n gl.vertexAttribPointer(aTexCoord, 2, gl.FLOAT, false, 0, 0);\n }\n }\n\n // Index buffer\n if (mesh.indices && mesh.indices.length > 0) {\n this.indexBuffer = gl.createBuffer();\n if (!this.indexBuffer) throw new Error('Failed to create index buffer');\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, mesh.indices, gl.STATIC_DRAW);\n }\n\n // Joint indices buffer (skinning)\n const aJointIndices = program\n ? gl.getAttribLocation(program, 'aJointIndices')\n : -1;\n if (\n mesh.jointIndices &&\n mesh.jointIndices.length > 0 &&\n aJointIndices !== -1\n ) {\n this.jointIndexBuffer = gl.createBuffer();\n if (!this.jointIndexBuffer)\n throw new Error('Failed to create joint index buffer');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.jointIndexBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, mesh.jointIndices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(aJointIndices);\n gl.vertexAttribPointer(aJointIndices, 4, gl.FLOAT, false, 0, 0);\n }\n\n // Joint weights buffer (skinning)\n const aJointWeights = program\n ? gl.getAttribLocation(program, 'aJointWeights')\n : -1;\n if (\n mesh.jointWeights &&\n mesh.jointWeights.length > 0 &&\n aJointWeights !== -1\n ) {\n this.jointWeightBuffer = gl.createBuffer();\n if (!this.jointWeightBuffer)\n throw new Error('Failed to create joint weight buffer');\n gl.bindBuffer(gl.ARRAY_BUFFER, this.jointWeightBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, mesh.jointWeights, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(aJointWeights);\n gl.vertexAttribPointer(aJointWeights, 4, gl.FLOAT, false, 0, 0);\n }\n\n if (gl2) {\n gl2.bindVertexArray(null);\n }\n }\n\n public dispose(gl: WebGL2RenderingContext) {\n if (!gl) {\n console.warn('Cannot dispose MeshBuffers: invalid GL context');\n return;\n }\n\n const isWebGL2 = gl instanceof WebGL2RenderingContext;\n\n if (this.vertexBuffer) gl.deleteBuffer(this.vertexBuffer);\n if (this.normalBuffer) gl.deleteBuffer(this.normalBuffer);\n if (this.texCoordBuffer) gl.deleteBuffer(this.texCoordBuffer);\n if (this.indexBuffer) gl.deleteBuffer(this.indexBuffer);\n if (this.jointIndexBuffer) gl.deleteBuffer(this.jointIndexBuffer);\n if (this.jointWeightBuffer) gl.deleteBuffer(this.jointWeightBuffer);\n\n if (isWebGL2 && this.vao) {\n (gl as unknown as WebGL2RenderingContext).deleteVertexArray(this.vao);\n }\n\n this.vertexBuffer =\n this.normalBuffer =\n this.texCoordBuffer =\n this.indexBuffer =\n this.jointIndexBuffer =\n this.jointWeightBuffer =\n this.vao =\n null;\n }\n}\n","// GLSL shader sources inlined as TypeScript strings so the package can\n// be built with tsup without requiring Vite's ?raw loader.\n\nexport const vsSource = /* glsl */ `\n#define MAX_JOINTS 128\n\nattribute vec3 aPosition;\nattribute vec3 aNormal;\nattribute vec2 aTexCoord;\n\n// ── Skinning attributes (vec4: up to 4 joint influences per vertex) ──\nattribute vec4 aJointIndices;\nattribute vec4 aJointWeights;\n\nuniform mat4 uModel;\nuniform mat4 uView;\nuniform mat4 uProjection;\n\n// ── Skinning uniforms ──\nuniform bool uUseSkinning;\nuniform mat4 uJointMatrices[MAX_JOINTS];\n\nvarying vec3 vNormal;\nvarying vec3 vPosition;\nvarying vec2 vTexCoord;\n\nvoid main() {\n vTexCoord = aTexCoord;\n\n vec4 pos = vec4(aPosition, 1.0);\n vec3 norm = aNormal;\n\n if (uUseSkinning) {\n mat4 skinMat =\n aJointWeights.x * uJointMatrices[int(aJointIndices.x)] +\n aJointWeights.y * uJointMatrices[int(aJointIndices.y)] +\n aJointWeights.z * uJointMatrices[int(aJointIndices.z)] +\n aJointWeights.w * uJointMatrices[int(aJointIndices.w)];\n pos = skinMat * pos;\n norm = mat3(skinMat) * norm;\n }\n\n vNormal = mat3(uModel) * norm;\n\n vec4 worldPosition = uModel * pos;\n vPosition = worldPosition.xyz;\n gl_Position = uProjection * uView * worldPosition;\n}\n`;\n\nexport const fsSource = /* glsl */ `\nprecision mediump float;\n\n#define MAX_LIGHTS 5\n\nvarying vec3 vNormal;\nvarying vec3 vPosition;\nvarying vec2 vTexCoord;\n\nuniform vec3 uLightDirection[MAX_LIGHTS];\nuniform vec3 uLightColor[MAX_LIGHTS];\nuniform float uLightIntensity[MAX_LIGHTS];\nuniform int uLightType[MAX_LIGHTS]; // 0=directional, 1=point, 2=ambient\nuniform int uLightCount;\nuniform vec3 uLightPosition[MAX_LIGHTS];\nuniform float uLightConstant[MAX_LIGHTS];\nuniform float uLightLinear[MAX_LIGHTS];\nuniform float uLightQuadratic[MAX_LIGHTS];\n\nuniform vec4 uColor;\nuniform bool uUnlit;\nuniform bool uUseTexture;\nuniform sampler2D uTexture;\n\nuniform vec3 uViewPosition;\nuniform float uShininess;\nuniform vec3 uSpecularColor;\n\nvoid main() {\n vec4 baseColor = uColor;\n if (uUseTexture) {\n baseColor *= texture2D(uTexture, vTexCoord);\n }\n\n if (uUnlit) {\n gl_FragColor = baseColor;\n return;\n }\n\n vec3 norm = normalize(vNormal);\n vec3 totalDiffuse = vec3(0.0);\n vec3 totalAmbient = vec3(0.0);\n vec3 totalSpecular = vec3(0.0);\n\n vec3 viewDir = normalize(uViewPosition - vPosition);\n\n for (int i = 0; i < MAX_LIGHTS; i++) {\n if (i >= uLightCount) break;\n\n if (uLightType[i] == 2) {\n totalAmbient += uLightColor[i] * uLightIntensity[i];\n } else {\n vec3 lightDir;\n float attenuation = 1.0;\n\n if (uLightType[i] == 0) {\n // Directional light\n lightDir = normalize(-uLightDirection[i]);\n } else {\n // Point light\n vec3 lightVec = uLightPosition[i] - vPosition;\n float distance = length(lightVec);\n lightDir = normalize(lightVec);\n attenuation = 1.0 / (\n uLightConstant[i] +\n uLightLinear[i] * distance +\n uLightQuadratic[i] * distance * distance\n );\n }\n\n // Diffuse\n float diff = max(dot(norm, lightDir), 0.0);\n totalDiffuse += diff * uLightColor[i] * uLightIntensity[i] * attenuation;\n\n // Specular (Blinn-Phong) — softer, more natural highlights\n vec3 halfDir = normalize(lightDir + viewDir);\n float spec = pow(max(dot(norm, halfDir), 0.0), uShininess);\n totalSpecular += spec * uSpecularColor * uLightIntensity[i] * attenuation;\n }\n }\n\n vec3 lightingResult =\n totalAmbient * baseColor.rgb +\n totalDiffuse * baseColor.rgb +\n totalSpecular;\n\n gl_FragColor = vec4(lightingResult, baseColor.a);\n}\n`;\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\nimport { vsSource, fsSource } from '../shaders/index';\n\nexport type RenderCallback = (\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n) => void;\n\nexport class WebGLCore {\n public gl: WebGL2RenderingContext | WebGLRenderingContext;\n public program: WebGLProgram;\n public canvas: HTMLCanvasElement;\n public isWebGL2: boolean;\n\n /**\n * Initialise the WebGL rendering core.\n *\n * @param canvasOrId - An `HTMLCanvasElement` or the DOM `id` of one.\n * Defaults to `'glcanvas'`.\n */\n constructor(canvasOrId: string | HTMLCanvasElement = 'glcanvas') {\n const canvas =\n typeof canvasOrId === 'string'\n ? (document.getElementById(canvasOrId) as HTMLCanvasElement | null)\n : canvasOrId;\n if (!canvas) throw new Error('Canvas not found');\n this.canvas = canvas;\n\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n\n this.gl = (canvas.getContext('webgl2') ?? canvas.getContext('webgl')) as\n | WebGL2RenderingContext\n | WebGLRenderingContext;\n\n if (!this.gl) throw new Error('WebGL not supported in this browser!');\n\n this.isWebGL2 = this.gl instanceof WebGL2RenderingContext;\n this.gl.viewport(0, 0, canvas.width, canvas.height);\n\n const program = this.createProgram(this.gl);\n if (!program) throw new Error('Failed to create program');\n this.program = program as unknown as WebGLProgram;\n }\n\n public getProgram(): WebGLProgram {\n return this.program;\n }\n\n public getRenderingContext(): WebGLRenderingContext {\n return this.gl;\n }\n\n private createProgram(gl: WebGLRenderingContext): WebGLProgram | null {\n const vertexShader = this.compileShader(gl, gl.VERTEX_SHADER, vsSource);\n const fragmentShader = this.compileShader(gl, gl.FRAGMENT_SHADER, fsSource);\n\n if (!vertexShader || !fragmentShader)\n throw new Error('Failed to create shaders');\n\n const program = gl.createProgram();\n if (!program) return null;\n\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n\n // Clean up shader objects\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error(gl.getProgramInfoLog(program));\n throw new Error(gl.getProgramInfoLog(program) || 'Program link error');\n }\n\n return program;\n }\n\n private compileShader(\n gl: WebGLRenderingContext,\n type: number,\n source: string,\n ): WebGLShader | null {\n const shader = gl.createShader(type);\n if (!shader) return null;\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n throw new Error(gl.getShaderInfoLog(shader) || 'Shader compile error');\n }\n return shader;\n }\n\n public resize(width: number, height: number) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n }\n\n dispose() {\n const { gl, program } = this;\n if (program) gl.deleteProgram(program);\n }\n}\n\nexport default WebGLCore;\n","import { mat4, quat, vec3 } from 'gl-matrix';\n\n/** Maximum number of joints supported per skeleton (must match shader). */\nexport const MAX_JOINTS = 128;\n\n/**\n * Describes a single joint (bone) inside a {@link Skeleton}.\n *\n * Each joint stores its default bind-pose transform (translation, rotation,\n * scale) and the inverse bind matrix used to transform vertices from model\n * space into joint-local space.\n */\nexport interface Joint {\n /** Human-readable name (e.g. \"Hips\", \"LeftArm\"). */\n name: string;\n /** Original glTF node index this joint references. */\n nodeIndex: number;\n /** Index of the parent joint in the skeleton's joint array (-1 = root). */\n parentIndex: number;\n /** Bind-pose translation. */\n localTranslation: vec3;\n /** Bind-pose rotation (quaternion). */\n localRotation: quat;\n /** Bind-pose scale. */\n localScale: vec3;\n /** Inverse bind matrix from the glTF skin. */\n inverseBindMatrix: mat4;\n}\n\n/**\n * Per-joint local transform produced by animation sampling.\n * Any undefined component falls back to the bind-pose value.\n */\nexport interface JointPose {\n t?: vec3;\n r?: quat;\n s?: vec3;\n}\n\n/**\n * A skeleton representing a hierarchy of {@link Joint}s.\n *\n * Call {@link computeJointMatrices} each frame with the current animation pose\n * to produce a flat `Float32Array` of `mat4`s ready for upload as a shader\n * uniform.\n */\nexport class Skeleton {\n /** Ordered joint list (parent always precedes child). */\n public readonly joints: Joint[];\n\n /**\n * Flat `Float32Array` of `joints.length` column-major `mat4` values.\n * Updated by {@link computeJointMatrices} — upload directly to\n * `uJointMatrices[0]`.\n */\n public readonly jointMatrices: Float32Array;\n\n /**\n * Global transform of the non-joint ancestor nodes above the skeleton\n * root. In many exported models the armature sits under a scene-root\n * node that carries scale / rotation (e.g. cm → m conversion). This\n * transform is pre-multiplied into root-joint globals so that\n * `global * inverseBindMatrix` evaluates to identity in the bind pose.\n */\n public readonly rootTransform: mat4;\n\n constructor(joints: Joint[], rootTransform?: mat4) {\n if (joints.length > MAX_JOINTS) {\n console.warn(\n `[Skeleton] ${joints.length} joints exceeds MAX_JOINTS (${MAX_JOINTS}). ` +\n 'Extra joints will be ignored by the shader.',\n );\n }\n this.joints = joints;\n this.jointMatrices = new Float32Array(joints.length * 16);\n this.rootTransform = rootTransform ?? mat4.create();\n }\n\n /** Number of joints in the skeleton. */\n get jointCount(): number {\n return this.joints.length;\n }\n\n /**\n * Walk the joint hierarchy, composing global transforms, then multiply by\n * each joint's inverse-bind matrix. The result is stored in\n * {@link jointMatrices} ready for shader upload.\n *\n * @param animatedPoses - Optional per-joint local transforms from an\n * {@link AnimationClip}. Map keys are **joint array indices** (not glTF\n * node indices).\n */\n computeJointMatrices(animatedPoses?: Map<number, JointPose>): void {\n const globals: mat4[] = new Array<mat4>(this.joints.length);\n const local = mat4.create();\n\n for (let i = 0; i < this.joints.length; i++) {\n const joint = this.joints[i];\n const pose = animatedPoses?.get(i);\n\n const t = pose?.t ?? joint.localTranslation;\n const r = pose?.r ?? joint.localRotation;\n const s = pose?.s ?? joint.localScale;\n\n mat4.fromRotationTranslationScale(local, r, t, s);\n\n if (joint.parentIndex >= 0) {\n globals[i] = mat4.create();\n mat4.multiply(globals[i], globals[joint.parentIndex], local);\n } else {\n // Root joint — include the non-joint ancestor transform\n globals[i] = mat4.create();\n mat4.multiply(globals[i], this.rootTransform, local);\n }\n\n // final = global * inverseBindMatrix\n const final = mat4.create();\n mat4.multiply(final, globals[i], joint.inverseBindMatrix);\n this.jointMatrices.set(final as unknown as Float32Array, i * 16);\n }\n }\n\n /**\n * Create a deep clone of this skeleton (useful when instancing models).\n */\n clone(): Skeleton {\n const clonedJoints: Joint[] = this.joints.map((j) => ({\n name: j.name,\n nodeIndex: j.nodeIndex,\n parentIndex: j.parentIndex,\n localTranslation: vec3.clone(j.localTranslation),\n localRotation: quat.clone(j.localRotation),\n localScale: vec3.clone(j.localScale),\n inverseBindMatrix: mat4.clone(j.inverseBindMatrix),\n }));\n return new Skeleton(clonedJoints, mat4.clone(this.rootTransform));\n }\n}\n","import { quat, vec3 } from 'gl-matrix';\nimport type { JointPose } from './Skeleton';\n\n// ─── Types ──────────────────────────────────────────────────────\n\n/** Interpolation mode as defined by glTF 2.0. */\nexport type InterpolationMode = 'STEP' | 'LINEAR' | 'CUBICSPLINE';\n\n/** Which transform component the channel drives. */\nexport type AnimationPath = 'translation' | 'rotation' | 'scale';\n\n/**\n * Stores the raw keyframe data for one animated property and performs\n * interpolation between keyframes.\n */\nexport interface AnimationSampler {\n /** Keyframe timestamps (seconds). */\n times: Float32Array;\n /** Flattened keyframe output values (3 or 4 components per key). */\n values: Float32Array;\n /** Interpolation mode (default `LINEAR`). */\n interpolation: InterpolationMode;\n}\n\n/**\n * Links a {@link AnimationSampler} to a specific joint property.\n */\nexport interface AnimationChannel {\n /** Index into the owning {@link Skeleton}'s joint array. */\n jointIndex: number;\n /** Transform component this channel drives. */\n path: AnimationPath;\n /** The sampler that holds keyframe data. */\n sampler: AnimationSampler;\n}\n\n// ─── AnimationClip ──────────────────────────────────────────────\n\n/**\n * A named animation clip containing one or more {@link AnimationChannel}s.\n *\n * Call {@link update} each frame to advance the playhead, then {@link sample}\n * to obtain per-joint local transforms that feed into\n * `Skeleton.computeJointMatrices()`.\n *\n * ```ts\n * clip.play();\n * // game loop:\n * clip.update(deltaTime);\n * const poses = clip.sample();\n * skeleton.computeJointMatrices(poses);\n * ```\n */\nexport class AnimationClip {\n /** Human-readable name (e.g. \"Walk\", \"Idle\"). */\n public readonly name: string;\n\n /** All channels in this clip. */\n public readonly channels: AnimationChannel[];\n\n /** Total duration in seconds (derived from the maximum keyframe time). */\n public readonly duration: number;\n\n /** Current playback time in seconds. */\n public currentTime = 0;\n\n /** Whether the clip loops when it reaches the end. */\n public loop = true;\n\n /** Playback speed multiplier (1 = normal, 2 = double, −1 = reverse). */\n public speed = 1;\n\n /** Whether the clip is currently advancing. */\n public playing = false;\n\n constructor(name: string, channels: AnimationChannel[], duration: number) {\n this.name = name;\n this.channels = channels;\n this.duration = duration;\n }\n\n /** Start / resume playback. */\n play(): void {\n this.playing = true;\n }\n\n /** Pause playback (keeps current time). */\n pause(): void {\n this.playing = false;\n }\n\n /** Stop and rewind to the beginning. */\n stop(): void {\n this.playing = false;\n this.currentTime = 0;\n }\n\n /** Rewind to the beginning without changing play state. */\n reset(): void {\n this.currentTime = 0;\n }\n\n /**\n * Advance the playhead by `deltaTime` seconds (respects {@link speed}).\n * Automatically loops or clamps depending on {@link loop}.\n */\n update(deltaTime: number): void {\n if (!this.playing || this.duration <= 0) return;\n\n this.currentTime += deltaTime * this.speed;\n\n if (this.loop) {\n this.currentTime =\n ((this.currentTime % this.duration) + this.duration) % this.duration;\n } else {\n if (this.currentTime >= this.duration) {\n this.currentTime = this.duration;\n this.playing = false;\n } else if (this.currentTime < 0) {\n this.currentTime = 0;\n this.playing = false;\n }\n }\n }\n\n /**\n * Sample every channel at the current playhead and return a map of\n * joint-index → local pose.\n */\n sample(): Map<number, JointPose> {\n const result = new Map<number, JointPose>();\n\n for (const channel of this.channels) {\n if (!result.has(channel.jointIndex)) {\n result.set(channel.jointIndex, {});\n }\n const entry = result.get(channel.jointIndex)!;\n const value = sampleChannel(channel, this.currentTime);\n\n switch (channel.path) {\n case 'translation':\n entry.t = value as vec3;\n break;\n case 'rotation':\n entry.r = value as quat;\n break;\n case 'scale':\n entry.s = value as vec3;\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Create an independent copy of this clip (shares the underlying sampler\n * data but has its own playback state).\n */\n clone(): AnimationClip {\n const copy = new AnimationClip(this.name, this.channels, this.duration);\n copy.loop = this.loop;\n copy.speed = this.speed;\n return copy;\n }\n}\n\n// ─── Sampling helpers ───────────────────────────────────────────\n\n/** Read `numComponents` floats from `values` starting at `index * numComponents`. */\nfunction readValue(\n values: Float32Array,\n index: number,\n numComponents: number,\n): vec3 | quat {\n const off = index * numComponents;\n if (numComponents === 4) {\n return quat.fromValues(\n values[off],\n values[off + 1],\n values[off + 2],\n values[off + 3],\n );\n }\n return vec3.fromValues(values[off], values[off + 1], values[off + 2]);\n}\n\n/**\n * Sample a single channel at the given time using its sampler's interpolation\n * mode. Returns a `vec3` for translation/scale or a `quat` for rotation.\n */\nfunction sampleChannel(channel: AnimationChannel, time: number): vec3 | quat {\n const { sampler, path } = channel;\n const { times, values, interpolation } = sampler;\n const numComponents = path === 'rotation' ? 4 : 3;\n\n // Edge cases — clamp to first / last keyframe\n if (times.length === 0) {\n return numComponents === 4 ? quat.create() : vec3.create();\n }\n if (time <= times[0]) {\n return readValue(values, 0, numComponents);\n }\n if (time >= times[times.length - 1]) {\n return readValue(values, times.length - 1, numComponents);\n }\n\n // Binary search for the surrounding keyframe pair\n let lo = 0;\n let hi = times.length - 1;\n while (lo < hi - 1) {\n const mid = (lo + hi) >>> 1;\n if (times[mid] <= time) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n const t0 = times[lo];\n const t1 = times[hi];\n const factor = (time - t0) / (t1 - t0);\n\n const v0 = readValue(values, lo, numComponents);\n const v1 = readValue(values, hi, numComponents);\n\n if (interpolation === 'STEP') {\n return v0;\n }\n\n // LINEAR (or fallback for CUBICSPLINE — true cubic not yet implemented)\n if (path === 'rotation') {\n const out = quat.create();\n quat.slerp(out, v0 as quat, v1 as quat, factor);\n return out;\n }\n\n const out = vec3.create();\n vec3.lerp(out, v0 as vec3, v1 as vec3, factor);\n return out;\n}\n","import { Material, Mesh } from '../classes';\nimport { GL_LINES } from '../classes/Mesh';\nimport { Vector3 } from '../domain/interfaces/Vectors';\n\nexport function createWireBox(\n min: Vector3,\n max: Vector3,\n material: Material,\n): Mesh {\n const [minX, minY, minZ] = min;\n const [maxX, maxY, maxZ] = max;\n\n // 8 corners of the box\n const vertices: number[] = [\n minX,\n minY,\n minZ,\n maxX,\n minY,\n minZ,\n maxX,\n maxY,\n minZ,\n minX,\n maxY,\n minZ,\n minX,\n minY,\n maxZ,\n maxX,\n minY,\n maxZ,\n maxX,\n maxY,\n maxZ,\n minX,\n maxY,\n maxZ,\n ];\n\n // edges as lines (pairs of indices)\n const indices: number[] = [\n 0,\n 1,\n 1,\n 2,\n 2,\n 3,\n 3,\n 0, // bottom face\n 4,\n 5,\n 5,\n 6,\n 6,\n 7,\n 7,\n 4, // top face\n 0,\n 4,\n 1,\n 5,\n 2,\n 6,\n 3,\n 7, // vertical edges\n ];\n\n // expand indices to vertices array (since WebGL uses gl.LINES)\n const lineVertices: number[] = [];\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i];\n lineVertices.push(\n vertices[idx * 3],\n vertices[idx * 3 + 1],\n vertices[idx * 3 + 2],\n );\n }\n\n // Normals can just be zero for wireframe\n const normals = new Float32Array(lineVertices.length);\n\n const mesh = new Mesh(\n 'hitbox',\n new Float32Array(lineVertices),\n normals,\n material,\n new Float32Array(),\n null,\n );\n mesh.setMode(GL_LINES);\n return mesh;\n}\n"],"mappings":"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","names":["mat4","quat","vec3","out","mat4"]}
@@ -0,0 +1,81 @@
1
+ // src/Core/controls/KeyboardControl.ts
2
+ var KeyboardControl = class {
3
+ pressedKeys = /* @__PURE__ */ new Set();
4
+ listeners = [];
5
+ keyDownHandler;
6
+ keyUpHandler;
7
+ enable() {
8
+ if (this.keyDownHandler || this.keyUpHandler) return;
9
+ this.keyDownHandler = (e) => {
10
+ const key = this.mapKey(e.key);
11
+ if (!key) return;
12
+ if (!this.pressedKeys.has(key)) {
13
+ this.pressedKeys.add(key);
14
+ this.notify(key, true);
15
+ }
16
+ };
17
+ this.keyUpHandler = (e) => {
18
+ const key = this.mapKey(e.key);
19
+ if (!key) return;
20
+ if (this.pressedKeys.has(key)) {
21
+ this.pressedKeys.delete(key);
22
+ this.notify(key, false);
23
+ }
24
+ };
25
+ window.addEventListener("keydown", this.keyDownHandler);
26
+ window.addEventListener("keyup", this.keyUpHandler);
27
+ }
28
+ disable() {
29
+ if (this.keyDownHandler) {
30
+ window.removeEventListener("keydown", this.keyDownHandler);
31
+ this.keyDownHandler = void 0;
32
+ }
33
+ if (this.keyUpHandler) {
34
+ window.removeEventListener("keyup", this.keyUpHandler);
35
+ this.keyUpHandler = void 0;
36
+ }
37
+ this.pressedKeys.clear();
38
+ }
39
+ onChange(listener) {
40
+ this.listeners.push(listener);
41
+ }
42
+ /** Remove a previously registered listener. */
43
+ removeListener(listener) {
44
+ this.listeners = this.listeners.filter((l) => l !== listener);
45
+ }
46
+ notify(key, isPressed) {
47
+ for (const listener of this.listeners) {
48
+ listener(key, isPressed);
49
+ }
50
+ }
51
+ mapKey(key) {
52
+ switch (key) {
53
+ case "w":
54
+ case "ArrowUp":
55
+ return "up";
56
+ case "s":
57
+ case "ArrowDown":
58
+ return "down";
59
+ case "a":
60
+ case "ArrowLeft":
61
+ return "left";
62
+ case "d":
63
+ case "ArrowRight":
64
+ return "right";
65
+ case " ":
66
+ return "jump";
67
+ case "Shift":
68
+ return "roll";
69
+ default:
70
+ return null;
71
+ }
72
+ }
73
+ isPressed(key) {
74
+ return this.pressedKeys.has(key);
75
+ }
76
+ };
77
+
78
+ export {
79
+ KeyboardControl
80
+ };
81
+ //# sourceMappingURL=chunk-SUNYSY45.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Core/controls/KeyboardControl.ts"],"sourcesContent":["type ControlKey = 'up' | 'down' | 'left' | 'right' | 'jump' | 'roll';\n\ntype ControlListener = (key: ControlKey, isPressed: boolean) => void;\n\nexport class KeyboardControl {\n private pressedKeys: Set<ControlKey> = new Set();\n private listeners: ControlListener[] = [];\n private keyDownHandler?: (e: KeyboardEvent) => void;\n private keyUpHandler?: (e: KeyboardEvent) => void;\n\n public enable() {\n if (this.keyDownHandler || this.keyUpHandler) return; // prevent duplicates\n\n this.keyDownHandler = (e: KeyboardEvent) => {\n const key = this.mapKey(e.key);\n if (!key) return;\n\n if (!this.pressedKeys.has(key)) {\n this.pressedKeys.add(key);\n this.notify(key, true);\n }\n };\n\n this.keyUpHandler = (e: KeyboardEvent) => {\n const key = this.mapKey(e.key);\n if (!key) return;\n\n if (this.pressedKeys.has(key)) {\n this.pressedKeys.delete(key);\n this.notify(key, false);\n }\n };\n\n window.addEventListener('keydown', this.keyDownHandler);\n window.addEventListener('keyup', this.keyUpHandler);\n }\n\n public disable() {\n if (this.keyDownHandler) {\n window.removeEventListener('keydown', this.keyDownHandler);\n this.keyDownHandler = undefined;\n }\n if (this.keyUpHandler) {\n window.removeEventListener('keyup', this.keyUpHandler);\n this.keyUpHandler = undefined;\n }\n this.pressedKeys.clear();\n }\n\n public onChange(listener: ControlListener) {\n this.listeners.push(listener);\n }\n\n /** Remove a previously registered listener. */\n public removeListener(listener: ControlListener) {\n this.listeners = this.listeners.filter((l) => l !== listener);\n }\n\n private notify(key: ControlKey, isPressed: boolean) {\n for (const listener of this.listeners) {\n listener(key, isPressed);\n }\n }\n\n private mapKey(key: string): ControlKey | null {\n switch (key) {\n case 'w':\n case 'ArrowUp':\n return 'up';\n case 's':\n case 'ArrowDown':\n return 'down';\n case 'a':\n case 'ArrowLeft':\n return 'left';\n case 'd':\n case 'ArrowRight':\n return 'right';\n case ' ':\n return 'jump';\n case 'Shift':\n return 'roll';\n default:\n return null;\n }\n }\n\n public isPressed(key: ControlKey): boolean {\n return this.pressedKeys.has(key);\n }\n}\n"],"mappings":";AAIO,IAAM,kBAAN,MAAsB;AAAA,EACnB,cAA+B,oBAAI,IAAI;AAAA,EACvC,YAA+B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EAED,SAAS;AACd,QAAI,KAAK,kBAAkB,KAAK,aAAc;AAE9C,SAAK,iBAAiB,CAAC,MAAqB;AAC1C,YAAM,MAAM,KAAK,OAAO,EAAE,GAAG;AAC7B,UAAI,CAAC,IAAK;AAEV,UAAI,CAAC,KAAK,YAAY,IAAI,GAAG,GAAG;AAC9B,aAAK,YAAY,IAAI,GAAG;AACxB,aAAK,OAAO,KAAK,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,eAAe,CAAC,MAAqB;AACxC,YAAM,MAAM,KAAK,OAAO,EAAE,GAAG;AAC7B,UAAI,CAAC,IAAK;AAEV,UAAI,KAAK,YAAY,IAAI,GAAG,GAAG;AAC7B,aAAK,YAAY,OAAO,GAAG;AAC3B,aAAK,OAAO,KAAK,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,KAAK,cAAc;AACtD,WAAO,iBAAiB,SAAS,KAAK,YAAY;AAAA,EACpD;AAAA,EAEO,UAAU;AACf,QAAI,KAAK,gBAAgB;AACvB,aAAO,oBAAoB,WAAW,KAAK,cAAc;AACzD,WAAK,iBAAiB;AAAA,IACxB;AACA,QAAI,KAAK,cAAc;AACrB,aAAO,oBAAoB,SAAS,KAAK,YAAY;AACrD,WAAK,eAAe;AAAA,IACtB;AACA,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEO,SAAS,UAA2B;AACzC,SAAK,UAAU,KAAK,QAAQ;AAAA,EAC9B;AAAA;AAAA,EAGO,eAAe,UAA2B;AAC/C,SAAK,YAAY,KAAK,UAAU,OAAO,CAAC,MAAM,MAAM,QAAQ;AAAA,EAC9D;AAAA,EAEQ,OAAO,KAAiB,WAAoB;AAClD,eAAW,YAAY,KAAK,WAAW;AACrC,eAAS,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,OAAO,KAAgC;AAC7C,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEO,UAAU,KAA0B;AACzC,WAAO,KAAK,YAAY,IAAI,GAAG;AAAA,EACjC;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "@fonsecabarreto/genesis-gl-core",
3
+ "version": "0.1.0",
4
+ "description": "GenesisGL — WebGL 3D engine for browser games",
5
+ "author": "Lucas Fonseca Barreto",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/Core/index.js",
9
+ "module": "./dist/Core/index.js",
10
+ "types": "./dist/Core/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/Core/index.js",
14
+ "types": "./dist/Core/index.d.ts"
15
+ },
16
+ "./Core": {
17
+ "import": "./dist/Core/index.js",
18
+ "types": "./dist/Core/index.d.ts"
19
+ },
20
+ "./Core/*": {
21
+ "import": "./dist/Core/*.js",
22
+ "types": "./dist/Core/*.d.ts"
23
+ },
24
+ "./Editor": {
25
+ "import": "./dist/Editor/index.js",
26
+ "types": "./dist/Editor/index.d.ts"
27
+ },
28
+ "./Editor/*": {
29
+ "import": "./dist/Editor/*.js",
30
+ "types": "./dist/Editor/*.d.ts"
31
+ },
32
+ "./Game": {
33
+ "import": "./dist/Game/index.js",
34
+ "types": "./dist/Game/index.d.ts"
35
+ },
36
+ "./Game/*": {
37
+ "import": "./dist/Game/*.js",
38
+ "types": "./dist/Game/*.d.ts"
39
+ }
40
+ },
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/fonsecaBarreto/project-genesis-gl.git"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/fonsecaBarreto/project-genesis-gl/issues"
47
+ },
48
+ "homepage": "https://github.com/fonsecaBarreto/project-genesis-gl#readme",
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "files": [
53
+ "dist",
54
+ "README.md",
55
+ "LICENSE"
56
+ ],
57
+ "keywords": [
58
+ "webgl",
59
+ "3d",
60
+ "game-engine",
61
+ "glsl",
62
+ "typescript",
63
+ "renderer"
64
+ ],
65
+ "scripts": {
66
+ "build": "tsup",
67
+ "dev": "tsup --watch",
68
+ "clean": "rimraf dist",
69
+ "typecheck": "tsc --noEmit"
70
+ },
71
+ "peerDependencies": {
72
+ "gl-matrix": "^3.4.4"
73
+ },
74
+ "devDependencies": {
75
+ "@types/node": "^20.11.30",
76
+ "rimraf": "^6.0.1",
77
+ "tsup": "^8.4.0",
78
+ "typescript": "^5.9.2"
79
+ },
80
+ "dependencies": {
81
+ "gl-matrix": "^3.4.4"
82
+ }
83
+ }