Przeglądaj źródła

move utilities to separate files.

for educational code this is more difficult as stuff is in different
places now.
Lucas Stadler 12 lat temu
rodzic
commit
c4384e1a62
4 zmienionych plików z 189 dodań i 189 usunięć
  1. 53 0
      js/pixl/public/geometry.js
  2. 22 0
      js/pixl/public/gl.js
  3. 111 0
      js/pixl/public/matrix.js
  4. 3 189
      js/pixl/public/trixl.html

+ 53 - 0
js/pixl/public/geometry.js

@ -0,0 +1,53 @@
1
var geometry = {};
2
geometry.cube = function() {
3
	return [
4
		// front
5
		0, 0, 0,
6
		1, 0, 0,
7
		0, 1, 0,
8
		0, 1, 0,
9
		1, 0, 0,
10
		1, 1, 0,
11
12
		// back
13
		1, 0, 1,
14
		0, 0, 1,
15
		1, 1, 1,
16
		1, 1, 1,
17
		0, 0, 1,
18
		0, 1, 1,
19
20
		// left
21
		0, 0, 1,
22
		0, 0, 0,
23
		0, 1, 1,
24
		0, 1, 1,
25
		0, 0, 0,
26
		0, 1, 0,
27
28
		// right
29
		1, 0, 0,
30
		1, 0, 1,
31
		1, 1, 0,
32
		1, 1, 0,
33
		1, 0, 1,
34
		1, 1, 1,
35
36
		// top
37
		0, 1, 0,
38
		1, 1, 0,
39
		0, 1, 1,
40
		0, 1, 1,
41
		1, 1, 0,
42
		1, 1, 1,
43
44
		// bottom
45
		0, 0, 1,
46
		1, 0, 1,
47
		0, 0, 0,
48
		0, 0, 0,
49
		1, 0, 1,
50
		1, 0, 0
51
	];
52
};
53

+ 22 - 0
js/pixl/public/gl.js

@ -0,0 +1,22 @@
1
var createShader = function(src, type) {
2
	var shader = gl.createShader(type);
3
	gl.shaderSource(shader, src);
4
	gl.compileShader(shader);
5
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
6
		throw gl.getShaderInfoLog(shader);
7
	}
8
	return shader;
9
}
10
11
var createProgram = function(vs, fs) {
12
	var program = gl.createProgram();
13
	var vs = createShader(vs, gl.VERTEX_SHADER);
14
	var fs = createShader(fs, gl.FRAGMENT_SHADER);
15
	gl.attachShader(program, vs);
16
	gl.attachShader(program, fs);
17
	gl.linkProgram(program);
18
	if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
19
		throw gl.getProgramInfoLog(program);
20
	}
21
	return program;
22
}

+ 111 - 0
js/pixl/public/matrix.js

@ -0,0 +1,111 @@
1
var matrix = {};
2
matrix.multiply = function(a, dim_a, b, dim_b) {
3
	if (dim_a[1] != dim_b[0]) {
4
		throw new Error("cols a != rows b");
5
	} else {
6
		var c = [];
7
		var s = dim_a[1];
8
		var n = dim_a[0],
9
			 m = dim_b[1];
10
		for (var i = 0; i < n; i++) {
11
			for (var j = 0; j < m; j++) {
12
				var sum = 0;
13
				for (var k = 0; k < s; k++) {
14
					sum += a[i * s + k] * b[k * m + j];
15
				}
16
				c[i * m + j] = sum;
17
			}
18
		}
19
		return c;
20
	}
21
};
22
23
matrix.multiplyMany4x4 = function() {
24
	var m = arguments[0];
25
	for(var i = 1; i < arguments.length; i++) {
26
		m = matrix.multiply(m, [4, 4], arguments[i], [4, 4]);
27
	}
28
	return m;
29
}
30
31
matrix.identity = function(dim) {
32
	var m = [];
33
	for(var i = 0; i < dim; i++) {
34
		for(var j = 0; j < dim; j++) {
35
			m[i * dim + j] = i == j ? 1.0 : 0.0;
36
		}
37
	}
38
	return m;
39
}
40
41
matrix.transpose = function(m, dim) {
42
	var t = [];
43
	for(var i = 0; i < dim[0]; i++) {
44
		for(var j = 0; j < dim[1]; j++) {
45
			t[j * dim[0] + i] = m[i * dim[1] + j];
46
		}
47
	}
48
	return t;
49
}
50
51
matrix.translate = function(tx, ty, tz) {
52
	var tx = tx || 0.0, ty = ty || 0.0, tz = tz || 0.0;
53
	return [
54
		1, 0, 0, 0,
55
		0, 1, 0, 0,
56
		0, 0, 1, 0,
57
		tx, ty, tz, 1
58
	];
59
}
60
61
matrix.scale = function(sx, sy, sz) {
62
	var sx = sx || 1.0, sy = sy || 1.0, sz = sz || 1.0;
63
	return [
64
		sx, 0,  0,  0,
65
		0,  sy, 0,  0,
66
		0,  0,  sz, 0,
67
		0,  0,  0,  1
68
	];
69
}
70
71
matrix.rotateX = function(angle) {
72
	var s = Math.sin(angle);
73
	var c = Math.cos(angle);
74
	return [
75
		1,  0, 0, 0,
76
		0,  c, s, 0,
77
		0, -s, c, 0,
78
		0,  0, 0, 1
79
	];
80
}
81
82
matrix.rotateY = function(angle) {
83
	var s = Math.sin(angle);
84
	var c = Math.cos(angle);
85
	return [
86
		c, 0, -s, 0,
87
		0, 1,  0, 0,
88
		s, 0,  c, 0,
89
		0, 0,  0, 1
90
	];
91
}
92
93
matrix.rotateZ = function(angle) {
94
	var s = Math.sin(angle);
95
	var c = Math.cos(angle);
96
	return [
97
		 c, s, 0, 0,
98
		-s, c, 0, 0,
99
		 0, 0, 1, 0,
100
		 0, 0, 0, 1
101
	];
102
}
103
104
matrix.persective = function(fov, aspect) {
105
	return [
106
		Math.PI / 3 / aspect, 0, 0, 0,
107
		0, Math.PI / 3, 0, 0,
108
		0, 0, 1, 1,
109
		0, 0, 0, 1
110
	];
111
}

+ 3 - 189
js/pixl/public/trixl.html

@ -49,195 +49,9 @@
49 49
			}
50 50
		}
51 51
	</script>
52
	<script>
53
		var createShader = function(src, type) {
54
			var shader = gl.createShader(type);
55
			gl.shaderSource(shader, src);
56
			gl.compileShader(shader);
57
			if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
58
				throw gl.getShaderInfoLog(shader);
59
			}
60
			return shader;
61
		}
62
63
		var createProgram = function(vs, fs) {
64
			var program = gl.createProgram();
65
			var vs = createShader(vs, gl.VERTEX_SHADER);
66
			var fs = createShader(fs, gl.FRAGMENT_SHADER);
67
			gl.attachShader(program, vs);
68
			gl.attachShader(program, fs);
69
			gl.linkProgram(program);
70
			if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
71
				throw gl.getProgramInfoLog(program);
72
			}
73
			return program;
74
		}
75
76
		var geometry = {};
77
		geometry.cube = function() {
78
			return [
79
				// front
80
				0, 0, 0,
81
				1, 0, 0,
82
				0, 1, 0,
83
				0, 1, 0,
84
				1, 0, 0,
85
				1, 1, 0,
86
87
				// back
88
				1, 0, 1,
89
				0, 0, 1,
90
				1, 1, 1,
91
				1, 1, 1,
92
				0, 0, 1,
93
				0, 1, 1,
94
95
				// left
96
				0, 0, 1,
97
				0, 0, 0,
98
				0, 1, 1,
99
				0, 1, 1,
100
				0, 0, 0,
101
				0, 1, 0,
102
103
				// right
104
				1, 0, 0,
105
				1, 0, 1,
106
				1, 1, 0,
107
				1, 1, 0,
108
				1, 0, 1,
109
				1, 1, 1,
110
111
				// top
112
				0, 1, 0,
113
				1, 1, 0,
114
				0, 1, 1,
115
				0, 1, 1,
116
				1, 1, 0,
117
				1, 1, 1,
118
119
				// bottom
120
				0, 0, 1,
121
				1, 0, 1,
122
				0, 0, 0,
123
				0, 0, 0,
124
				1, 0, 1,
125
				1, 0, 0
126
			];
127
		};
128
129
		var matrix = {};
130
		matrix.multiply = function(a, dim_a, b, dim_b) {
131
			if (dim_a[1] != dim_b[0]) {
132
				throw new Error("cols a != rows b");
133
			} else {
134
				var c = [];
135
				var s = dim_a[1];
136
				var n = dim_a[0],
137
				    m = dim_b[1];
138
				for (var i = 0; i < n; i++) {
139
					for (var j = 0; j < m; j++) {
140
						var sum = 0;
141
						for (var k = 0; k < s; k++) {
142
							sum += a[i * s + k] * b[k * m + j];
143
						}
144
						c[i * m + j] = sum;
145
					}
146
				}
147
				return c;
148
			}
149
		};
150
151
		matrix.multiplyMany4x4 = function() {
152
			var m = arguments[0];
153
			for(var i = 1; i < arguments.length; i++) {
154
				m = matrix.multiply(m, [4, 4], arguments[i], [4, 4]);
155
			}
156
			return m;
157
		}
158
159
		matrix.identity = function(dim) {
160
			var m = [];
161
			for(var i = 0; i < dim; i++) {
162
				for(var j = 0; j < dim; j++) {
163
					m[i * dim + j] = i == j ? 1.0 : 0.0;
164
				}
165
			}
166
			return m;
167
		}
168
169
		matrix.transpose = function(m, dim) {
170
			var t = [];
171
			for(var i = 0; i < dim[0]; i++) {
172
				for(var j = 0; j < dim[1]; j++) {
173
					t[j * dim[0] + i] = m[i * dim[1] + j];
174
				}
175
			}
176
			return t;
177
		}
178
179
		matrix.translate = function(tx, ty, tz) {
180
			var tx = tx || 0.0, ty = ty || 0.0, tz = tz || 0.0;
181
			return [
182
				1, 0, 0, 0,
183
				0, 1, 0, 0,
184
				0, 0, 1, 0,
185
				tx, ty, tz, 1
186
			];
187
		}
188
189
		matrix.scale = function(sx, sy, sz) {
190
			var sx = sx || 1.0, sy = sy || 1.0, sz = sz || 1.0;
191
			return [
192
				sx, 0,  0,  0,
193
				0,  sy, 0,  0,
194
				0,  0,  sz, 0,
195
				0,  0,  0,  1
196
			];
197
		}
198
199
		matrix.rotateX = function(angle) {
200
			var s = Math.sin(angle);
201
			var c = Math.cos(angle);
202
			return [
203
				1,  0, 0, 0,
204
				0,  c, s, 0,
205
				0, -s, c, 0,
206
				0,  0, 0, 1
207
			];
208
		}
209
210
		matrix.rotateY = function(angle) {
211
			var s = Math.sin(angle);
212
			var c = Math.cos(angle);
213
			return [
214
				c, 0, -s, 0,
215
				0, 1,  0, 0,
216
				s, 0,  c, 0,
217
				0, 0,  0, 1
218
			];
219
		}
220
221
		matrix.rotateZ = function(angle) {
222
			var s = Math.sin(angle);
223
			var c = Math.cos(angle);
224
			return [
225
				 c, s, 0, 0,
226
				-s, c, 0, 0,
227
				 0, 0, 1, 0,
228
				 0, 0, 0, 1
229
			];
230
		}
231
232
		matrix.persective = function(fov, aspect) {
233
			return [
234
				Math.PI / 3 / aspect, 0, 0, 0,
235
				0, Math.PI / 3, 0, 0,
236
				0, 0, 1, 1,
237
				0, 0, 0, 1
238
			];
239
		}
240
	</script>
52
	<script src="gl.js"></script>
53
	<script src="geometry.js"></script>
54
	<script src="matrix.js"></script>
241 55
	<script>
242 56
		window.trixl = {};
243 57
		trixl.stage = document.querySelector("#stage");