@cjcoding-git/gamelib 0.0.0-stage → 1.1.3

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 (136) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  3. package/.github/dependabot.yml +6 -0
  4. package/.github/workflows/build.yml +54 -0
  5. package/.github/workflows/release.yml +79 -0
  6. package/LICENSE +21 -0
  7. package/README.md +6 -2
  8. package/assets/test-frog.gltf +1921 -0
  9. package/assets/test-frog.gml +0 -0
  10. package/buildtime.txt +1 -0
  11. package/buildversion.txt +1 -0
  12. package/dist/GameLib.js +71599 -0
  13. package/dist/GameLib.min.js +8 -0
  14. package/docs/2D/API.md +1 -0
  15. package/docs/2D/GETTING_STARTED.md +1 -0
  16. package/docs/3D/API.md +1 -0
  17. package/docs/3D/GETTING_STARTED.md +23 -0
  18. package/docs/Core/API.md +1 -0
  19. package/docs/Core/GETTING_STARTED.md +1 -0
  20. package/docs/README.md +32 -0
  21. package/package.json +21 -4
  22. package/scripts/gltf2gml.html +312 -0
  23. package/src/2D/Box.js +42 -0
  24. package/src/2D/Coord.js +17 -0
  25. package/src/2D/GameLib.js +317 -0
  26. package/src/2D/Renderable.js +31 -0
  27. package/src/2D/Rotation.js +42 -0
  28. package/src/2D/Size.js +17 -0
  29. package/src/2D/Sprite.js +56 -0
  30. package/src/2D/UI/Button.js +52 -0
  31. package/src/2D/UI/TextInput.js +77 -0
  32. package/src/2D/UI/UIElement.js +10 -0
  33. package/src/2D/UI/index.js +15 -0
  34. package/src/2D/index.js +24 -0
  35. package/src/3D/Camera.js +25 -0
  36. package/src/3D/GameLib.js +202 -0
  37. package/src/3D/Geometry/Box.js +39 -0
  38. package/src/3D/Geometry/Cone.js +45 -0
  39. package/src/3D/Geometry/ModelLoaders/GLBLoader.js +12 -0
  40. package/src/3D/Geometry/ModelLoaders/GLTFLoader.js +12 -0
  41. package/src/3D/Geometry/ModelLoaders/GMLLoader.js +114 -0
  42. package/src/3D/Geometry/ModelLoaders/OBJLoader.js +12 -0
  43. package/src/3D/Geometry/ModelLoaders/index.js +17 -0
  44. package/src/3D/Geometry/Pyramid.js +55 -0
  45. package/src/3D/Geometry/Sphere.js +37 -0
  46. package/src/3D/Geometry/index.js +19 -0
  47. package/src/3D/Lighting/AmbientLight.js +17 -0
  48. package/src/3D/Lighting/DirectionalLight.js +17 -0
  49. package/src/3D/Lighting/PointLight.js +17 -0
  50. package/src/3D/Lighting/index.js +15 -0
  51. package/src/3D/Material.js +181 -0
  52. package/src/3D/Mesh.js +142 -0
  53. package/src/3D/Object.js +13 -0
  54. package/src/3D/Position.js +15 -0
  55. package/src/3D/Rotation.js +21 -0
  56. package/src/3D/Scale.js +10 -0
  57. package/src/3D/ShaderFactory/FunctionParam.js +14 -0
  58. package/src/3D/ShaderFactory/Modifiers/Variable.js +85 -0
  59. package/src/3D/ShaderFactory/Modifiers/index.js +11 -0
  60. package/src/3D/ShaderFactory/Node.js +25 -0
  61. package/src/3D/ShaderFactory/NodeTypes/A.js +9 -0
  62. package/src/3D/ShaderFactory/NodeTypes/Add.js +13 -0
  63. package/src/3D/ShaderFactory/NodeTypes/AssignVariable.js +11 -0
  64. package/src/3D/ShaderFactory/NodeTypes/Clamp.js +14 -0
  65. package/src/3D/ShaderFactory/NodeTypes/Constant.js +9 -0
  66. package/src/3D/ShaderFactory/NodeTypes/Define.js +11 -0
  67. package/src/3D/ShaderFactory/NodeTypes/Divide.js +13 -0
  68. package/src/3D/ShaderFactory/NodeTypes/Dot.js +14 -0
  69. package/src/3D/ShaderFactory/NodeTypes/Exp2.js +9 -0
  70. package/src/3D/ShaderFactory/NodeTypes/Function.js +36 -0
  71. package/src/3D/ShaderFactory/NodeTypes/Group.js +9 -0
  72. package/src/3D/ShaderFactory/NodeTypes/Header.js +12 -0
  73. package/src/3D/ShaderFactory/NodeTypes/Length.js +9 -0
  74. package/src/3D/ShaderFactory/NodeTypes/MainFunction.js +7 -0
  75. package/src/3D/ShaderFactory/NodeTypes/Max.js +14 -0
  76. package/src/3D/ShaderFactory/NodeTypes/Mix.js +14 -0
  77. package/src/3D/ShaderFactory/NodeTypes/Multiply.js +13 -0
  78. package/src/3D/ShaderFactory/NodeTypes/Negative.js +9 -0
  79. package/src/3D/ShaderFactory/NodeTypes/NodeTypes.js +9 -0
  80. package/src/3D/ShaderFactory/NodeTypes/Normalize.js +10 -0
  81. package/src/3D/ShaderFactory/NodeTypes/Precision.js +11 -0
  82. package/src/3D/ShaderFactory/NodeTypes/RGB.js +9 -0
  83. package/src/3D/ShaderFactory/NodeTypes/Subtract.js +13 -0
  84. package/src/3D/ShaderFactory/NodeTypes/Symbol.js +9 -0
  85. package/src/3D/ShaderFactory/NodeTypes/Texture2D.js +10 -0
  86. package/src/3D/ShaderFactory/NodeTypes/Variable.js +22 -0
  87. package/src/3D/ShaderFactory/NodeTypes/Vector.js +15 -0
  88. package/src/3D/ShaderFactory/NodeTypes/XYZ.js +9 -0
  89. package/src/3D/ShaderFactory/NodeTypes/index.js +32 -0
  90. package/src/3D/ShaderFactory/PrecisionTypes.js +8 -0
  91. package/src/3D/ShaderFactory/Program.js +41 -0
  92. package/src/3D/ShaderFactory/VariableTypes.js +49 -0
  93. package/src/3D/ShaderFactory/index.js +45 -0
  94. package/src/3D/Texture.js +59 -0
  95. package/src/3D/TextureFactory.js +22 -0
  96. package/src/3D/Transform.js +35 -0
  97. package/src/3D/UI/UIImage.js +24 -0
  98. package/src/3D/UI/UILoading.js +41 -0
  99. package/src/3D/UI/UIObject.js +16 -0
  100. package/src/3D/UI/UIPath.js +25 -0
  101. package/src/3D/UI/UIRenderer.js +207 -0
  102. package/src/3D/UI/UIText.js +35 -0
  103. package/src/3D/UI/index.js +19 -0
  104. package/src/3D/Utils.js +9 -0
  105. package/src/3D/index.js +43 -0
  106. package/src/Core/AssetManager.js +116 -0
  107. package/src/Core/AudioManager.js +151 -0
  108. package/src/Core/Error.js +9 -0
  109. package/src/Core/FullscreenManager.js +49 -0
  110. package/src/Core/GameLibBase.js +29 -0
  111. package/src/Core/InputManager.js +195 -0
  112. package/src/Core/Loading.js +111 -0
  113. package/src/Core/Matrix/index.js +11 -0
  114. package/src/Core/Matrix/mat4.js +178 -0
  115. package/src/Core/Multiplayer.js +54 -0
  116. package/src/Core/Network/PeerNetwork.js +410 -0
  117. package/src/Core/Network/index.js +11 -0
  118. package/src/Core/Storage.js +45 -0
  119. package/src/Core/Store.js +45 -0
  120. package/src/Core/Utils.js +34 -0
  121. package/src/Core/index.js +30 -0
  122. package/src/Lib/Ammo.js +72 -0
  123. package/src/Lib/Matter.js +1 -0
  124. package/src/Shaders/Material/Fragment/GL1.glsl +49 -0
  125. package/src/Shaders/Material/Fragment/GL2.glsl +51 -0
  126. package/src/Shaders/Material/Vertex/GL1.glsl +19 -0
  127. package/src/Shaders/Material/Vertex/GL2.glsl +20 -0
  128. package/src/Shaders/UI/Fragment/GL1.glsl +5 -0
  129. package/src/Shaders/UI/Fragment/GL2.glsl +7 -0
  130. package/src/Shaders/UI/Vertex/GL1.glsl +10 -0
  131. package/src/Shaders/UI/Vertex/GL2.glsl +11 -0
  132. package/src/Shaders/UITexture/Fragment/GL1.glsl +6 -0
  133. package/src/Shaders/UITexture/Fragment/GL2.glsl +8 -0
  134. package/src/Shaders/UITexture/Vertex/GL1.glsl +10 -0
  135. package/src/Shaders/UITexture/Vertex/GL2.glsl +11 -0
  136. package/src/index.js +19 -0
@@ -0,0 +1,181 @@
1
+ import { GameLibCore } from "../Core/index.js"
2
+ import GL1Vertex from "../Shaders/Material/Vertex/GL1.glsl"
3
+ import GL1Fragment from "../Shaders/Material/Fragment/GL1.glsl"
4
+ import GL2Vertex from "../Shaders/Material/Vertex/GL2.glsl"
5
+ import GL2Fragment from "../Shaders/Material/Fragment/GL2.glsl"
6
+ class Material {
7
+ constructor(gameLib, shader = null) {
8
+ if (!gameLib) {
9
+ throw new GameLibCore.Error("Constructing a Material requires a GameLib instance.");
10
+ }
11
+ this.gameLib = gameLib;
12
+ this.program = shader;
13
+ this.hasColor = false;
14
+ this.color = null;
15
+ this.gradient = null;
16
+ this.texture = null;
17
+ this.textureUnit = 0;
18
+ this.uniforms = {};
19
+ }
20
+ static webGL1VertexShader = GL1Vertex;
21
+ static webGL1FragmentShader = GL1Fragment;
22
+ static webGL2VertexShader = GL2Vertex;
23
+ static webGL2FragmentShader = GL2Fragment;
24
+ static get standardVertexShader() {
25
+ return Material.webGL1VertexShader;
26
+ }
27
+ static get standardFragmentShader() {
28
+ return Material.webGL1FragmentShader;
29
+ }
30
+ static normalizeColor(color) {
31
+ if (!Array.isArray(color)) {
32
+ return [ 1.0, 1.0, 1.0, 1.0 ];
33
+ }
34
+ if (color.length === 3) {
35
+ return [ color[0], color[1], color[2], 1.0 ];
36
+ }
37
+ if (color.length >= 4) {
38
+ return [ color[0], color[1], color[2], color[3] ];
39
+ }
40
+ return [ 1.0, 1.0, 1.0, 1.0 ];
41
+ }
42
+ static interpolate(a, b, t) {
43
+ return a + (b - a) * t;
44
+ }
45
+ static createStandardProgram(gameLib) {
46
+ if (!gameLib || !gameLib.webgl) {
47
+ throw new GameLibCore.Error("Material.createStandardProgram(gameLib) requires a GameLib instance with a WebGL context.");
48
+ }
49
+ var webgl = gameLib.webgl;
50
+ var isWebGL2 = !gameLib.options || gameLib.options.webGL2 !== false;
51
+ var vertexSource = isWebGL2 ? Material.webGL2VertexShader : Material.webGL1VertexShader;
52
+ var fragmentSource = isWebGL2 ? Material.webGL2FragmentShader : Material.webGL1FragmentShader;
53
+ var vertexShader = gameLib.compileShader(webgl.VERTEX_SHADER, vertexSource);
54
+ var fragmentShader = gameLib.compileShader(webgl.FRAGMENT_SHADER, fragmentSource);
55
+ if (!vertexShader || !fragmentShader) {
56
+ console.warn("[GameLib] Standard material shader compilation failed.");
57
+ return null;
58
+ }
59
+ var program = gameLib.createProgram(vertexShader, fragmentShader);
60
+ if (!program) {
61
+ console.warn("[GameLib] Standard material shader linking failed.");
62
+ return null;
63
+ }
64
+ return program;
65
+ }
66
+ static getDefaultProgram(gameLib) {
67
+ return Material.createStandardProgram(gameLib);
68
+ }
69
+ ensureProgram(gameLib = this.gameLib) {
70
+ if (!this.program && gameLib) {
71
+ this.program = Material.createStandardProgram(gameLib);
72
+ }
73
+ return this.program;
74
+ }
75
+ setColor(color) {
76
+ this.color = Material.normalizeColor(color);
77
+ this.hasColor = true;
78
+ this.gradient = null;
79
+ return this;
80
+ }
81
+ setTexture(texture) {
82
+ this.texture = texture;
83
+ return this;
84
+ }
85
+ setGradient(stops, options = {}) {
86
+ if (!Array.isArray(stops) || stops.length === 0) {
87
+ this.gradient = null;
88
+ return this;
89
+ }
90
+ this.gradient = {
91
+ source: options.source || "uv",
92
+ axis: options.axis || "y",
93
+ stops: stops
94
+ .map((stop) => {
95
+ if (!Array.isArray(stop) || stop.length < 2) {
96
+ return null;
97
+ }
98
+ return [ Number(stop[0]), Material.normalizeColor(stop[1]) ];
99
+ })
100
+ .filter(Boolean)
101
+ .sort((a, b) => a[0] - b[0])
102
+ };
103
+ if (this.gradient.stops.length === 0) {
104
+ this.gradient = null;
105
+ return this;
106
+ }
107
+ this.hasColor = true;
108
+ this.color = null;
109
+ return this;
110
+ }
111
+ interpolateGradient(value) {
112
+ if (!this.gradient || this.gradient.stops.length === 0) {
113
+ return [ 1.0, 1.0, 1.0, 1.0 ];
114
+ }
115
+ var stops = this.gradient.stops;
116
+ if (value <= stops[0][0]) {
117
+ return stops[0][1];
118
+ }
119
+ for (var i = 0; i < stops.length - 1; i++) {
120
+ var current = stops[i];
121
+ var next = stops[i + 1];
122
+ if (value >= current[0] && value <= next[0]) {
123
+ var t = (value - current[0]) / (next[0] - current[0] || 1);
124
+ return [
125
+ Material.interpolate(current[1][0], next[1][0], t),
126
+ Material.interpolate(current[1][1], next[1][1], t),
127
+ Material.interpolate(current[1][2], next[1][2], t),
128
+ Material.interpolate(current[1][3], next[1][3], t)
129
+ ];
130
+ }
131
+ }
132
+ return stops[stops.length - 1][1];
133
+ }
134
+ getVertexColors(geometry) {
135
+ var vertexCount = Math.max(1, Math.floor((geometry.positions?.length || 0) / 3));
136
+ var colors = [];
137
+ if (!this.hasColor && !this.gradient) {
138
+ for (var i = 0; i < vertexCount; i++) {
139
+ colors.push(1.0, 1.0, 1.0, 1.0);
140
+ }
141
+ return new Float32Array(colors);
142
+ }
143
+ if (this.gradient) {
144
+ var axis = (this.gradient.axis || "y").toLowerCase();
145
+ var source = (this.gradient.source || "uv").toLowerCase();
146
+ var axisIndex = axis === "x" ? 0 : axis === "z" ? 2 : 1;
147
+ var coordinates = [];
148
+ if (source === "position" && Array.isArray(geometry.positions)) {
149
+ for (var i = 0; i < vertexCount; i++) {
150
+ coordinates.push(geometry.positions[i * 3 + axisIndex]);
151
+ }
152
+ } else if (Array.isArray(geometry.uv)) {
153
+ var uvIndex = axis === "x" ? 0 : 1;
154
+ for (var i = 0; i < vertexCount; i++) {
155
+ coordinates.push(geometry.uv[i * 2 + uvIndex] ?? 0.5);
156
+ }
157
+ } else if (Array.isArray(geometry.positions)) {
158
+ for (var i = 0; i < vertexCount; i++) {
159
+ coordinates.push(geometry.positions[i * 3 + axisIndex]);
160
+ }
161
+ } else {
162
+ for (var i = 0; i < vertexCount; i++) {
163
+ coordinates.push(0.5);
164
+ }
165
+ }
166
+ for (var i = 0; i < vertexCount; i++) {
167
+ var color = this.interpolateGradient(coordinates[i]);
168
+ colors.push(color[0], color[1], color[2], color[3]);
169
+ }
170
+ return new Float32Array(colors);
171
+ }
172
+ var baseColor = Material.normalizeColor(this.color || [ 1.0, 1.0, 1.0, 1.0 ]);
173
+ for (var i = 0; i < vertexCount; i++) {
174
+ colors.push(baseColor[0], baseColor[1], baseColor[2], baseColor[3]);
175
+ }
176
+ return new Float32Array(colors);
177
+ }
178
+ }
179
+ export {
180
+ Material
181
+ }
package/src/3D/Mesh.js ADDED
@@ -0,0 +1,142 @@
1
+ import { Object } from "./Object.js"
2
+ import { Transform } from "./Transform.js"
3
+ import { mat4 } from "../Core/Matrix/mat4.js"
4
+ class Mesh extends Object {
5
+ constructor(gameLib, scene, geometryData, material) {
6
+ super(gameLib, scene);
7
+ this.transform = new Transform();
8
+ this.material = material;
9
+ this.geometry = geometryData;
10
+ this.buffers = {};
11
+ }
12
+ setup() {
13
+ var webgl = this._gl;
14
+ var program = this.material.ensureProgram(this._gameLib);
15
+ if (program) {
16
+ this._gameLib.useProgram(program);
17
+ }
18
+ this.buffers.position = webgl.createBuffer();
19
+ webgl.bindBuffer(webgl.ARRAY_BUFFER, this.buffers.position);
20
+ webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(this.geometry.positions), webgl.STATIC_DRAW);
21
+ this.buffers.normal = webgl.createBuffer();
22
+ webgl.bindBuffer(webgl.ARRAY_BUFFER, this.buffers.normal);
23
+ webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(this.geometry.normals), webgl.STATIC_DRAW);
24
+ this.buffers.uv = webgl.createBuffer();
25
+ webgl.bindBuffer(webgl.ARRAY_BUFFER, this.buffers.uv);
26
+ webgl.bufferData(webgl.ARRAY_BUFFER, new Float32Array(this.geometry.uv || []), webgl.STATIC_DRAW);
27
+ var colors = this.material.getVertexColors ? this.material.getVertexColors(this.geometry) : new Float32Array([]);
28
+ this.buffers.color = webgl.createBuffer();
29
+ webgl.bindBuffer(webgl.ARRAY_BUFFER, this.buffers.color);
30
+ webgl.bufferData(webgl.ARRAY_BUFFER, colors, webgl.STATIC_DRAW);
31
+ this.buffers.indices = webgl.createBuffer();
32
+ webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, this.buffers.indices);
33
+ webgl.bufferData(webgl.ELEMENT_ARRAY_BUFFER, new Uint16Array(this.geometry.indices), webgl.STATIC_DRAW);
34
+ this.indexCount = this.geometry.indices.length;
35
+ }
36
+ draw(camera) {
37
+ var webgl = this._gl;
38
+ var materialProgram = this.material && this.material.ensureProgram && this.material.ensureProgram(this._gameLib);
39
+ if (!materialProgram) return;
40
+ this._gameLib.useProgram(materialProgram);
41
+ var aspect = webgl.canvas.clientWidth / webgl.canvas.clientHeight;
42
+ var projectionMatrix = camera.getProjectionMatrix(aspect);
43
+ var viewMatrix = camera.getViewMatrix();
44
+ var modelMatrix = this.transform.getModelMatrix();
45
+ var modelViewMatrix = mat4.create();
46
+ mat4.multiply(modelViewMatrix, viewMatrix, modelMatrix);
47
+ var normalMatrix = this.transform.getNormalMatrix(modelViewMatrix);
48
+ var uniform = name => this._gameLib.getAttributeLocation(materialProgram, name, "uniform");
49
+ this._gameLib.setProgramAttribute(materialProgram, "aVertexPosition", this.buffers.position, 3);
50
+ this._gameLib.setProgramAttribute(materialProgram, "aVertexNormal", this.buffers.normal, 3);
51
+ this._gameLib.setProgramAttribute(materialProgram, "aVertexColor", this.buffers.color, 4);
52
+ this._gameLib.setProgramAttribute(materialProgram, "aTextureCoord", this.buffers.uv, 2);
53
+ var useTextureLocation = uniform("uUseTexture");
54
+ if (useTextureLocation !== null) {
55
+ webgl.uniform1i(useTextureLocation, this.material.texture ? 1 : 0);
56
+ }
57
+ if (this.material.texture) {
58
+ var textureUnit = this.material.textureUnit || 0;
59
+ this.material.texture.bind(textureUnit);
60
+ var textureLocation = uniform("uTexture");
61
+ if (textureLocation !== null) {
62
+ webgl.uniform1i(textureLocation, textureUnit);
63
+ }
64
+ }
65
+ var projectionLocation = uniform("uProjectionMatrix");
66
+ if (projectionLocation !== null) {
67
+ webgl.uniformMatrix4fv(projectionLocation, false, projectionMatrix);
68
+ }
69
+ var modelViewLocation = uniform("uModelViewMatrix");
70
+ if (modelViewLocation !== null) {
71
+ webgl.uniformMatrix4fv(modelViewLocation, false, modelViewMatrix);
72
+ }
73
+ var normalLocation = uniform("uNormalMatrix");
74
+ if (normalLocation !== null) {
75
+ webgl.uniformMatrix4fv(normalLocation, false, normalMatrix);
76
+ }
77
+ var MAX_LIGHTS = 8;
78
+ var lights = this._gameLib.getLights(this.scene).slice(0, MAX_LIGHTS);
79
+ var lightTypes = [];
80
+ var lightColors = [];
81
+ var lightVectors = [];
82
+ var lightIntensities = [];
83
+ var lightRanges = [];
84
+ var getVector3 = (value) => {
85
+ if (Array.isArray(value)) return [value[0] || 0, value[1] || 0, value[2] || 0];
86
+ if (value && typeof value === "object") {
87
+ if (typeof value.x !== "undefined" && typeof value.y !== "undefined" && typeof value.z !== "undefined") {
88
+ return [value.x, value.y, value.z];
89
+ }
90
+ }
91
+ return [0, 0, 0];
92
+ };
93
+ for (var light of lights) {
94
+ var type = light.type === "ambient" ? 0 : light.type === "point" ? 2 : 1;
95
+ lightTypes.push(type);
96
+ var color = Array.isArray(light.color) ? light.color : [1, 1, 1];
97
+ lightColors.push(color[0] || 0, color[1] || 0, color[2] || 0);
98
+ lightIntensities.push(light.intensity || 0);
99
+ lightRanges.push(light.range || 1);
100
+ var source = type === 2 ? getVector3(light.position) : getVector3(light.direction || light.position);
101
+ var x = source[0];
102
+ var y = source[1];
103
+ var z = source[2];
104
+ if (type === 2) {
105
+ lightVectors.push(viewMatrix[0] * x + viewMatrix[4] * y + viewMatrix[8] * z + viewMatrix[12], viewMatrix[1] * x + viewMatrix[5] * y + viewMatrix[9] * z + viewMatrix[13], viewMatrix[2] * x + viewMatrix[6] * y + viewMatrix[10] * z + viewMatrix[14]);
106
+ } else {
107
+ lightVectors.push(viewMatrix[0] * x + viewMatrix[4] * y + viewMatrix[8] * z, viewMatrix[1] * x + viewMatrix[5] * y + viewMatrix[9] * z, viewMatrix[2] * x + viewMatrix[6] * y + viewMatrix[10] * z);
108
+ }
109
+ }
110
+ var lightCountLocation = uniform("uLightCount");
111
+ if (lightCountLocation !== null) {
112
+ webgl.uniform1i(lightCountLocation, lights.length);
113
+ }
114
+ if (lights.length > 0) {
115
+ var typeLocation = uniform("uLightType[0]");
116
+ if (typeLocation !== null) {
117
+ webgl.uniform1iv(typeLocation, new Int32Array(lightTypes));
118
+ }
119
+ var colorLocation = uniform("uLightColor[0]");
120
+ if (colorLocation !== null) {
121
+ webgl.uniform3fv(colorLocation, new Float32Array(lightColors));
122
+ }
123
+ var vectorLocation = uniform("uLightVector[0]");
124
+ if (vectorLocation !== null) {
125
+ webgl.uniform3fv(vectorLocation, new Float32Array(lightVectors));
126
+ }
127
+ var intensityLocation = uniform("uLightIntensity[0]");
128
+ if (intensityLocation !== null) {
129
+ webgl.uniform1fv(intensityLocation, new Float32Array(lightIntensities));
130
+ }
131
+ var rangeLocation = uniform("uLightRange[0]");
132
+ if (rangeLocation !== null) {
133
+ webgl.uniform1fv(rangeLocation, new Float32Array(lightRanges));
134
+ }
135
+ }
136
+ webgl.bindBuffer(webgl.ELEMENT_ARRAY_BUFFER, this.buffers.indices);
137
+ webgl.drawElements(webgl.TRIANGLES, this.indexCount, webgl.UNSIGNED_SHORT, 0);
138
+ }
139
+ }
140
+ export {
141
+ Mesh
142
+ }
@@ -0,0 +1,13 @@
1
+ class Object {
2
+ constructor(gameLib, scene) {
3
+ this._gameLib = gameLib;
4
+ this._gl = this._gameLib.webgl;
5
+ this.scene = scene;
6
+ }
7
+ setup() {}
8
+ update(camera) {}
9
+ draw(camera) {}
10
+ }
11
+ export {
12
+ Object
13
+ }
@@ -0,0 +1,15 @@
1
+ class Position {
2
+ constructor(x=0, y=0, z=0) {
3
+ this.x = x;
4
+ this.y = y;
5
+ this.z = z;
6
+ }
7
+ translate(dx, dy, dz) {
8
+ this.x += dx;
9
+ this.y += dy;
10
+ this.z += dz;
11
+ }
12
+ }
13
+ export {
14
+ Position
15
+ }
@@ -0,0 +1,21 @@
1
+ class Rotation {
2
+ constructor(x=0, y=0, z=0) {
3
+ this.x = x;
4
+ this.y = y;
5
+ this.z = z;
6
+ }
7
+ static d2r(deg) {
8
+ return (deg * Math.PI) / 180;
9
+ }
10
+ static r2d(rad) {
11
+ return rad * (180 / Math.PI);
12
+ }
13
+ rotate(rx, ry, rz) {
14
+ this.x += rx;
15
+ this.y += ry;
16
+ this.z += rz;
17
+ }
18
+ }
19
+ export {
20
+ Rotation
21
+ }
@@ -0,0 +1,10 @@
1
+ class Scale {
2
+ constructor(x=1, y=1, z=1) {
3
+ this.x = x;
4
+ this.y = y;
5
+ this.z = z;
6
+ }
7
+ }
8
+ export {
9
+ Scale
10
+ }
@@ -0,0 +1,14 @@
1
+ import { Modifiers } from "./Modifiers/index.js"
2
+ class FunctionParam {
3
+ constructor(type, name, modifiers) {
4
+ if(!modifiers || !(Modifiers.Variable)) modifiers = new Modifiers.Variable();
5
+ modifiers.update();
6
+ this._type = type;
7
+ this._name = name;
8
+ this._modifiers = modifiers;
9
+ this.text = `${this._modifiers.text}${this._type} ${this._name}`;
10
+ }
11
+ }
12
+ export {
13
+ FunctionParam
14
+ }
@@ -0,0 +1,85 @@
1
+ import { GameLibCore } from "../../../Core/index.js"
2
+ class Variable {
3
+ constructor({ input=false, output=false, uniform=false, attribute=false, varying=false, constant=false, precision=null } = {}) {
4
+ this._input = input;
5
+ this._output = output;
6
+ this._uniform = uniform;
7
+ this._attribute = attribute;
8
+ this._varying = varying;
9
+ this._constant = constant;
10
+ this._precision = precision;
11
+ this.text = null;
12
+ this.update();
13
+ }
14
+ update() {
15
+ var includeProps = [ "_input", "_output", "_uniform", "_attribute", "_varying" ];
16
+ var matchedProps = 0;
17
+ for(var i=0;i<includeProps.length;i++) {
18
+ var prop = includeProps[i];
19
+ if(this[prop]) matchedProps += 1;
20
+ }
21
+ if(matchedProps > 1) {
22
+ throw new GameLibCore.Error("Class GameLib3D.ShaderFactory.Modifiers.Variable has conflicting properties!");
23
+ }
24
+ this.text = "";
25
+ if(this._constant) this.text += "const ";
26
+ if(this._input) this.text += "in ";
27
+ if(this._output) this.text += "out ";
28
+ if(this._uniform) this.text += "uniform ";
29
+ if(this._attribute) this.text += "attribute ";
30
+ if(this._varying) this.text += "varying ";
31
+ if(this._precision) this.text += `${this._precision} `;
32
+ }
33
+ get input() {
34
+ return this._input;
35
+ }
36
+ set input(value) {
37
+ this._input = value;
38
+ this.update();
39
+ }
40
+ get output() {
41
+ return this._output;
42
+ }
43
+ set output(value) {
44
+ this._output = value;
45
+ this.update();
46
+ }
47
+ get uniform() {
48
+ return this._uniform;
49
+ }
50
+ set uniform(value) {
51
+ this._uniform = value;
52
+ this.update();
53
+ }
54
+ get attribute() {
55
+ return this._attribute;
56
+ }
57
+ set attribute(value) {
58
+ this._attribute = value;
59
+ this.update();
60
+ }
61
+ get varying() {
62
+ return this._varying;
63
+ }
64
+ set varying(value) {
65
+ this._varying = value;
66
+ this.update();
67
+ }
68
+ get constant() {
69
+ return this._constant;
70
+ }
71
+ set constant(value) {
72
+ this._constant = value;
73
+ this.update();
74
+ }
75
+ get precision() {
76
+ return this._precision;
77
+ }
78
+ set precision(value) {
79
+ this._precision = value;
80
+ this.update();
81
+ }
82
+ }
83
+ export {
84
+ Variable
85
+ }
@@ -0,0 +1,11 @@
1
+ import { GameLibCore } from "../../../Core/index.js"
2
+ import { Variable } from "./Variable.js"
3
+ class Modifiers {
4
+ constructor() {
5
+ throw new GameLibCore.Error("Class GameLib3D.ShaderFactory.Modifiers may not be constructed!");
6
+ }
7
+ static Variable = Variable;
8
+ }
9
+ export {
10
+ Modifiers
11
+ }
@@ -0,0 +1,25 @@
1
+ import { GameLibCore } from "../../Core/index.js"
2
+ class Node {
3
+ constructor() {
4
+ this.canHaveChildren = false;
5
+ this.canAddNode = false;
6
+ this.canAddVar = false;
7
+ this.canAddHeader = false;
8
+ this._nodes = [];
9
+ this._parent = null;
10
+ this.text = null;
11
+ }
12
+ addNode(node) {
13
+ if(!node.canAddNode) {
14
+ throw new GameLibCore.Error("Cannot add a GameLib3D.ShaderFactory.Node that has canAddNode set to false!");
15
+ }
16
+ if(!this.canHaveChildren) {
17
+ throw new GameLibCore.Error("Trying to add children to a GameLib3D.ShaderFactory.Node that cannot contain children!");
18
+ }
19
+ node._parent = this;
20
+ this._nodes.push(node);
21
+ }
22
+ }
23
+ export {
24
+ Node
25
+ }
@@ -0,0 +1,9 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.A = class ANode extends Node {
4
+ constructor(value) {
5
+ super();
6
+ this._value = value;
7
+ this.text = `(${this._value.text}).a`;
8
+ }
9
+ };
@@ -0,0 +1,13 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Add = class AddNode extends Node {
4
+ constructor(...values) {
5
+ super();
6
+ this._values = values;
7
+ var valueTexts = [];
8
+ for(var i=0;i<this._values.length;i++) {
9
+ valueTexts.push(this._values[i].text);
10
+ }
11
+ this.text = valueTexts.join(' + ');
12
+ }
13
+ };
@@ -0,0 +1,11 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.AssignVariable = class AssignVariableNode extends Node {
4
+ constructor(target, node) {
5
+ super();
6
+ this._target = target;
7
+ this._node = node;
8
+ this.canAddNode = true;
9
+ this.text = `${this._target} = ${this._node.text};`;
10
+ }
11
+ };
@@ -0,0 +1,14 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Clamp = class ClampNode extends Node {
4
+ constructor(...values) {
5
+ super();
6
+ this._values = values;
7
+ var valueTexts = [];
8
+ for(var i=0;i<this._values.length;i++) {
9
+ valueTexts.push(this._values[i].text);
10
+ }
11
+ var valuesText = valueTexts.join(', ');
12
+ this.text = `clamp(${valuesText})`;
13
+ }
14
+ };
@@ -0,0 +1,9 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Constant = class ConstantNode extends Node {
4
+ constructor(value) {
5
+ super();
6
+ this._value = value;
7
+ this.text = value;
8
+ }
9
+ };
@@ -0,0 +1,11 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Define = class DefineNode extends Node {
4
+ constructor(name, value) {
5
+ super();
6
+ this.canAddNode = true;
7
+ this._name = name;
8
+ this._value = value;
9
+ this.text = `#define ${this._name} ${this._value.text}`;
10
+ }
11
+ };
@@ -0,0 +1,13 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Divide = class DivideNode extends Node {
4
+ constructor(...values) {
5
+ super();
6
+ this._values = values;
7
+ var valueTexts = [];
8
+ for(var i=0;i<this._values.length;i++) {
9
+ valueTexts.push(this._values[i].text);
10
+ }
11
+ this.text = valueTexts.join(' / ');
12
+ }
13
+ };
@@ -0,0 +1,14 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Dot = class DotNode extends Node {
4
+ constructor(...values) {
5
+ super();
6
+ this._values = values;
7
+ var valueTexts = [];
8
+ for(var i=0;i<this._values.length;i++) {
9
+ valueTexts.push(this._values[i].text);
10
+ }
11
+ var valuesText = valueTexts.join(', ');
12
+ this.text = `dot(${valuesText})`;
13
+ }
14
+ };
@@ -0,0 +1,9 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ NodeTypes.Exp2 = class Exp2Node extends Node {
4
+ constructor(value) {
5
+ super();
6
+ this._value = value;
7
+ this.text = `exp2(${this._value.text})`;
8
+ }
9
+ };
@@ -0,0 +1,36 @@
1
+ import { NodeTypes } from "./NodeTypes.js"
2
+ import { Node } from "../Node.js"
3
+ import { GameLibCore } from "../../../Core/index.js"
4
+ NodeTypes.Function = class FunctionNode extends Node {
5
+ constructor(type, name, params) {
6
+ super();
7
+ this.canAddNode = true;
8
+ this.canHaveChildren = true;
9
+ this._type = type;
10
+ this._name = name;
11
+ this._params = params;
12
+ var paramsText = this._params.join(', ');
13
+ this._startText = `${this._type} ${this._name}(${paramsText}) {\n`;
14
+ this._endText = "\n}";
15
+ this.update();
16
+ }
17
+ update() {
18
+ var nodeTexts = [];
19
+ for(var i=0;i<this._nodes.length;i++) {
20
+ nodeTexts.push(this._nodes[i].text);
21
+ }
22
+ var nodesText = nodeTexts.join("\n");
23
+ this.text = `${this._startText}${nodesText}${this._endText}`;
24
+ }
25
+ addNode(node) {
26
+ if(!node.canAddNode) {
27
+ throw new GameLibCore.Error("Cannot add a GameLib3D.ShaderFactory.Node that has canAddNode set to false!");
28
+ }
29
+ if(!this.canHaveChildren) {
30
+ throw new GameLibCore.Error("Trying to add children to a GameLib3D.ShaderFactory.Node that cannot contain children!");
31
+ }
32
+ node._parent = this;
33
+ this._nodes.push(node);
34
+ this.update();
35
+ }
36
+ };