Sfoglia il codice sorgente

move utilities to separate files.

for educational code this is more difficult as stuff is in different
places now.
Lucas Stadler 12 anni fa
parent
commit
c4384e1a62
4 ha cambiato i file con 189 aggiunte e 189 eliminazioni
  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");