diff --git a/typescript/fourjs/app.js b/typescript/fourjs/app.js new file mode 100644 index 0000000..173c876 --- /dev/null +++ b/typescript/fourjs/app.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const express = require("express"); +const app = express(); +const http = require("http").Server(app); +app.get("/", (req, res) => { + res.sendFile(`${__dirname}/public/index.html`); +}); +app.use("/public", express.static(__dirname + "/public")); +const port = 8000; +http.listen(port, () => { + console.log(`>>Listeing on port ${port}`); +}); +const sender_1 = require("./server/four/sender"); +const sender = new sender_1.ShaderSender(app, __dirname); +sender.listen({ + vertex: "shaders/vertex.glsl", + fragment: "shaders/fragment.glsl" +}); diff --git a/typescript/fourjs/app.ts b/typescript/fourjs/app.ts new file mode 100644 index 0000000..adfdb53 --- /dev/null +++ b/typescript/fourjs/app.ts @@ -0,0 +1,21 @@ +const express = require("express"); +const app = express(); +const http = require("http").Server(app); + +app.get("/",(req,res) => { + res.sendFile(`${__dirname}/public/index.html`); +}); +app.use("/public",express.static(__dirname + "/public")); + +const port = 8000; + +http.listen(port, () => { + console.log(`>>Listeing on port ${port}`); +}); +import {ShaderSender} from "./server/four/sender"; + +const sender = new ShaderSender(app,__dirname); +sender.listen({ + vertex:"shaders/vertex.glsl", + fragment:"shaders/fragment.glsl" +}); diff --git a/typescript/fourjs/package-lock.json b/typescript/fourjs/package-lock.json new file mode 100644 index 0000000..c2884b7 --- /dev/null +++ b/typescript/fourjs/package-lock.json @@ -0,0 +1,424 @@ +{ + "name": "four", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/body-parser": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", + "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", + "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "requires": { + "@types/node": "*" + } + }, + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==" + }, + "@types/express": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", + "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", + "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", + "requires": { + "@types/events": "*", + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/mime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" + }, + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" + }, + "@types/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +} diff --git a/typescript/fourjs/package.json b/typescript/fourjs/package.json new file mode 100644 index 0000000..9bdbf5f --- /dev/null +++ b/typescript/fourjs/package.json @@ -0,0 +1,16 @@ +{ + "name": "four", + "version": "1.0.0", + "description": "", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Matei Adriel", + "license": "ISC", + "dependencies": { + "@types/express": "^4.16.0", + "express": "^4.16.4", + "typescript": "^3.2.2" + } +} diff --git a/typescript/fourjs/public/index.html b/typescript/fourjs/public/index.html new file mode 100644 index 0000000..38a4b8a --- /dev/null +++ b/typescript/fourjs/public/index.html @@ -0,0 +1,19 @@ + + + + + + + Four + + + + + + + + + diff --git a/typescript/fourjs/public/js/gl.mjs b/typescript/fourjs/public/js/gl.mjs new file mode 100644 index 0000000..cea8b7f --- /dev/null +++ b/typescript/fourjs/public/js/gl.mjs @@ -0,0 +1,47 @@ +class GL{ + constructor(){ + this.id = GL.id++; + this.color = "#0000ff"; + + this.objects = []; + } + createObject(){ + const obj = new Object(arguments); + + this.objects.push(obj); + } + init(){ + const canvas = ``; + $("body").append(canvas); + + this.canvas = $(`#${this.id}`)[0]; + this.ctx = this.canvas.getContext("webgl2"); + + console.log(this.canvas); + + if (!this.ctx){ console.error("WebGL context is not available."); return null; } + + return this; + } + updateColor(){ + this.ctx.clearColor(this.color); + + return this; + } + setColor(color){ + this.color = color; + this.ctx.updateColor(); + + return this; + } + clear(){ + this.ctx.clear( + this.ctx.COLOR_BUFFER_BIT | + this.ctx.DEPTH_BUFFER_BIT + ); + return this; + } +} +GL.id = 0; + +export {GL}; diff --git a/typescript/fourjs/public/js/main.mjs b/typescript/fourjs/public/js/main.mjs new file mode 100644 index 0000000..050331b --- /dev/null +++ b/typescript/fourjs/public/js/main.mjs @@ -0,0 +1,44 @@ +import {GL} from "./gl.mjs"; +import {ShaderCompiler} from "./shader.mjs" + +const renderer = new GL(); +renderer.init(); + +const compiler = new ShaderCompiler(renderer); +compiler.getShader("http://localhost:8000/fragment") +compiler.getShader("http://localhost:8000/vertex") +// +// const vShaderTxt = ShaderUtil.load("vertex_shader"), +// fShaderTxt = ShaderUtil.domShaderSrc("fragment_shader"), +// // 2. Compile text and validate +// vShader = ShaderUtil.createShader(gl,vShaderTxt,gl.VERTEX_SHADER), +// fShader = ShaderUtil.createShader(gl,fShaderTxt,gl.FRAGMENT_SHADER), +// // 3. Link the shaders together as a program. +// shaderProg = ShaderUtil.createProgram(gl,vShader,fShader,true); +// +// +// +// // 4. Get Location of Uniforms and Attributes. +// gl.useProgram(shaderProg); +// var aPositionLoc = gl.getAttribLocation(shaderProg,"a_position"), +// uPointSizeLoc = gl.getUniformLocation(shaderProg,"uPointSize"); +// gl.useProgram(null); +// //............................................ +// //Set Up Data Buffers +// var aryVerts = new Float32Array([0,0,0, 0.5,0.5,0 ]), +// bufVerts = gl.createBuffer(); +// gl.bindBuffer(gl.ARRAY_BUFFER,bufVerts); +// gl.bufferData(gl.ARRAY_BUFFER, aryVerts, gl.STATIC_DRAW); +// gl.bindBuffer(gl.ARRAY_BUFFER,null); +// //............................................ +// //Set Up For Drawing +// gl.useProgram(shaderProg); //Activate the Shader +// gl.uniform1f(uPointSizeLoc,50.0); //Store data to the shader's uniform variable uPointSize +// //how its down without VAOs +// gl.bindBuffer(gl.ARRAY_BUFFER,bufVerts); //Tell gl which buffer we want to use at the moment +// gl.enableVertexAttribArray(aPositionLoc); //Enable the position attribute in the shader +// gl.vertexAttribPointer(aPositionLoc,3,gl.FLOAT,false,0,0); //Set which buffer the attribute will pull its data from +// gl.bindBuffer(gl.ARRAY_BUFFER,null); //Done setting up the buffer +// +// this.gl.drawArrays(gl.POINTS, 0, 2); //Draw the points +// }); diff --git a/typescript/fourjs/public/js/shader.mjs b/typescript/fourjs/public/js/shader.mjs new file mode 100644 index 0000000..1ab7db5 --- /dev/null +++ b/typescript/fourjs/public/js/shader.mjs @@ -0,0 +1,62 @@ +class ShaderCompiler{ + constructor(gl){ + this.ctx = gl.ctx; + } + createShader(gl,src,type){ + const shader = this.ctx.createShader(type); + + this.ctx.shaderSource(shader,src); + this.ctx.compileShader(shader); + + //Get Error data if shader failed compiling + if(!this.ctx.getShaderParameter(shader, this.ctx.COMPILE_STATUS)){ + console.error(`Error compiling shader: ${src}. Log: ${gl.getShaderInfoLog(shader)}`); + this.ctx.deleteShader(shader); + return null; + } + + return shader; + } + + createProgram(gl,vShader,fShader,doValidate){ + //Link shaders together + const prog = gl.ctx.createProgram(); + + this.ctx.attachShader(prog,vShader); + this.ctx.attachShader(prog,fShader); + this.ctx.linkProgram(prog); + + //Check if successful + if(!this.ctx.getProgramParameter(prog, gl.LINK_STATUS)){ + console.error(`Error creating shader program. Log: ${gl.getProgramInfoLog(prog)}`); + this.ctx.deleteProgram(prog); + return null; + } + + //Only do this for additional debugging. + if(doValidate){ + this.ctx.validateProgram(prog); + if(!this.ctx.getProgramParameter(prog,gl.VALIDATE_STATUS)){ + console.error(`Error validating shader program. Log: ${gl.getProgramInfoLog(prog)}`); + this.ctx.deleteProgram(prog); + return null; + } + } + + //Can delete the shaders since the program has been made. + this.ctx.detachShader(prog,vShader); //TODO, detaching might cause issues on some browsers, Might only need to delete. + this.ctx.detachShader(prog,fShader); + this.ctx.deleteShader(fShader); + this.ctx.deleteShader(vShader); + + return prog; + } + async getShader(url){ + const response = await fetch(url); + const obj = await response.json(); + const text = obj.text; + console.log(text); + } +} + +export {ShaderCompiler}; diff --git a/typescript/fourjs/server/four/sender.js b/typescript/fourjs/server/four/sender.js new file mode 100644 index 0000000..bc8c4a5 --- /dev/null +++ b/typescript/fourjs/server/four/sender.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const read_1 = require("../read"); +class ShaderSender { + constructor(app, dir) { + this.app = app; + this.dir = dir; + } + async listen(data) { + for (let i in data) { + const text = await read_1.read(`./${data[i]}`); + this.app.get(`/${i}`, (req, res) => { + res.json({ text }); + }); + } + } +} +exports.ShaderSender = ShaderSender; diff --git a/typescript/fourjs/server/four/sender.ts b/typescript/fourjs/server/four/sender.ts new file mode 100644 index 0000000..6d322cd --- /dev/null +++ b/typescript/fourjs/server/four/sender.ts @@ -0,0 +1,14 @@ +import {read} from "../read" +class ShaderSender{ + constructor(public app,public dir:String){} + async listen(data:any){ + for (let i in data){ + const text = await read(`./${data[i]}`); + this.app.get(`/${i}`,(req,res) => { + res.json({text}); + }); + } + } +} + +export {ShaderSender}; diff --git a/typescript/fourjs/server/read.js b/typescript/fourjs/server/read.js new file mode 100644 index 0000000..303dc15 --- /dev/null +++ b/typescript/fourjs/server/read.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const fs = require('fs'); +function read(url) { + return new Promise((resolve, reject) => { + fs.readFile(`./${url}`, "utf8", (err, data) => { + if (err) + reject(err); + resolve(data); + }); + }); +} +exports.read = read; diff --git a/typescript/fourjs/server/read.ts b/typescript/fourjs/server/read.ts new file mode 100644 index 0000000..5abc4b9 --- /dev/null +++ b/typescript/fourjs/server/read.ts @@ -0,0 +1,12 @@ +const fs = require('fs'); + +function read(url:string):Promise{ + return new Promise((resolve,reject) => { + fs.readFile(`./${url}`,"utf8",(err,data) => { + if (err) reject(err); + resolve(data); + }); + }); +} + +export {read}; diff --git a/typescript/fourjs/shaders/fragment.glsl b/typescript/fourjs/shaders/fragment.glsl new file mode 100644 index 0000000..c8602c2 --- /dev/null +++ b/typescript/fourjs/shaders/fragment.glsl @@ -0,0 +1,9 @@ +#version 300 es + +precision mediump float; + +out vec4 finalColor; + +void main(void) { + finalColor = vec4(0.0, 0.0, 0.0, 1.0); +} diff --git a/typescript/fourjs/shaders/vertex.glsl b/typescript/fourjs/shaders/vertex.glsl new file mode 100644 index 0000000..5e7add1 --- /dev/null +++ b/typescript/fourjs/shaders/vertex.glsl @@ -0,0 +1,9 @@ +#version 300 es + +in vec3 a_position; + +uniform float uPointSize; +void main(void){ + gl_PointSize = uPointSize; + gl_Position = vec4(a_position, 1.0); +} diff --git a/typescript/fourjs/tsconfig.json b/typescript/fourjs/tsconfig.json new file mode 100644 index 0000000..4a38e41 --- /dev/null +++ b/typescript/fourjs/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions":{ + "target":"esnext", + "watch":true, + "lib":["es2017"], + "module": "commonjs" + }, + "exclude": ["node_modules", "**/__tests__/*"] +}