PageRenderTime 33ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/Demo/glUtils.js

http://github.com/mbebenita/Broadway
JavaScript | 193 lines | 149 code | 28 blank | 16 comment | 39 complexity | 3c40256182234ed8e1095cbe87237410 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // augment Sylvester some
  2. Matrix.Translation = function (v)
  3. {
  4. if (v.elements.length == 2) {
  5. var r = Matrix.I(3);
  6. r.elements[2][0] = v.elements[0];
  7. r.elements[2][1] = v.elements[1];
  8. return r;
  9. }
  10. if (v.elements.length == 3) {
  11. var r = Matrix.I(4);
  12. r.elements[0][3] = v.elements[0];
  13. r.elements[1][3] = v.elements[1];
  14. r.elements[2][3] = v.elements[2];
  15. return r;
  16. }
  17. throw "Invalid length for Translation";
  18. }
  19. Matrix.prototype.flatten = function ()
  20. {
  21. var result = [];
  22. if (this.elements.length == 0)
  23. return [];
  24. for (var j = 0; j < this.elements[0].length; j++)
  25. for (var i = 0; i < this.elements.length; i++)
  26. result.push(this.elements[i][j]);
  27. return result;
  28. }
  29. Matrix.prototype.ensure4x4 = function()
  30. {
  31. if (this.elements.length == 4 &&
  32. this.elements[0].length == 4)
  33. return this;
  34. if (this.elements.length > 4 ||
  35. this.elements[0].length > 4)
  36. return null;
  37. for (var i = 0; i < this.elements.length; i++) {
  38. for (var j = this.elements[i].length; j < 4; j++) {
  39. if (i == j)
  40. this.elements[i].push(1);
  41. else
  42. this.elements[i].push(0);
  43. }
  44. }
  45. for (var i = this.elements.length; i < 4; i++) {
  46. if (i == 0)
  47. this.elements.push([1, 0, 0, 0]);
  48. else if (i == 1)
  49. this.elements.push([0, 1, 0, 0]);
  50. else if (i == 2)
  51. this.elements.push([0, 0, 1, 0]);
  52. else if (i == 3)
  53. this.elements.push([0, 0, 0, 1]);
  54. }
  55. return this;
  56. };
  57. Matrix.prototype.make3x3 = function()
  58. {
  59. if (this.elements.length != 4 ||
  60. this.elements[0].length != 4)
  61. return null;
  62. return Matrix.create([[this.elements[0][0], this.elements[0][1], this.elements[0][2]],
  63. [this.elements[1][0], this.elements[1][1], this.elements[1][2]],
  64. [this.elements[2][0], this.elements[2][1], this.elements[2][2]]]);
  65. };
  66. Vector.prototype.flatten = function ()
  67. {
  68. return this.elements;
  69. };
  70. function mht(m) {
  71. var s = "";
  72. if (m.length == 16) {
  73. for (var i = 0; i < 4; i++) {
  74. s += "<span style='font-family: monospace'>[" + m[i*4+0].toFixed(4) + "," + m[i*4+1].toFixed(4) + "," + m[i*4+2].toFixed(4) + "," + m[i*4+3].toFixed(4) + "]</span><br>";
  75. }
  76. } else if (m.length == 9) {
  77. for (var i = 0; i < 3; i++) {
  78. s += "<span style='font-family: monospace'>[" + m[i*3+0].toFixed(4) + "," + m[i*3+1].toFixed(4) + "," + m[i*3+2].toFixed(4) + "]</font><br>";
  79. }
  80. } else {
  81. return m.toString();
  82. }
  83. return s;
  84. }
  85. //
  86. // gluLookAt
  87. //
  88. function makeLookAt(ex, ey, ez,
  89. cx, cy, cz,
  90. ux, uy, uz)
  91. {
  92. var eye = $V([ex, ey, ez]);
  93. var center = $V([cx, cy, cz]);
  94. var up = $V([ux, uy, uz]);
  95. var mag;
  96. var z = eye.subtract(center).toUnitVector();
  97. var x = up.cross(z).toUnitVector();
  98. var y = z.cross(x).toUnitVector();
  99. var m = $M([[x.e(1), x.e(2), x.e(3), 0],
  100. [y.e(1), y.e(2), y.e(3), 0],
  101. [z.e(1), z.e(2), z.e(3), 0],
  102. [0, 0, 0, 1]]);
  103. var t = $M([[1, 0, 0, -ex],
  104. [0, 1, 0, -ey],
  105. [0, 0, 1, -ez],
  106. [0, 0, 0, 1]]);
  107. return m.x(t);
  108. }
  109. //
  110. // glOrtho
  111. //
  112. function makeOrtho(left, right,
  113. bottom, top,
  114. znear, zfar)
  115. {
  116. var tx = -(right+left)/(right-left);
  117. var ty = -(top+bottom)/(top-bottom);
  118. var tz = -(zfar+znear)/(zfar-znear);
  119. return $M([[2/(right-left), 0, 0, tx],
  120. [0, 2/(top-bottom), 0, ty],
  121. [0, 0, -2/(zfar-znear), tz],
  122. [0, 0, 0, 1]]);
  123. }
  124. //
  125. // gluPerspective
  126. //
  127. function makePerspective(fovy, aspect, znear, zfar)
  128. {
  129. var ymax = znear * Math.tan(fovy * Math.PI / 360.0);
  130. var ymin = -ymax;
  131. var xmin = ymin * aspect;
  132. var xmax = ymax * aspect;
  133. return makeFrustum(xmin, xmax, ymin, ymax, znear, zfar);
  134. }
  135. //
  136. // glFrustum
  137. //
  138. function makeFrustum(left, right,
  139. bottom, top,
  140. znear, zfar)
  141. {
  142. var X = 2*znear/(right-left);
  143. var Y = 2*znear/(top-bottom);
  144. var A = (right+left)/(right-left);
  145. var B = (top+bottom)/(top-bottom);
  146. var C = -(zfar+znear)/(zfar-znear);
  147. var D = -2*zfar*znear/(zfar-znear);
  148. return $M([[X, 0, A, 0],
  149. [0, Y, B, 0],
  150. [0, 0, C, D],
  151. [0, 0, -1, 0]]);
  152. }
  153. //
  154. // glOrtho
  155. //
  156. function makeOrtho(left, right, bottom, top, znear, zfar)
  157. {
  158. var tx = - (right + left) / (right - left);
  159. var ty = - (top + bottom) / (top - bottom);
  160. var tz = - (zfar + znear) / (zfar - znear);
  161. return $M([[2 / (right - left), 0, 0, tx],
  162. [0, 2 / (top - bottom), 0, ty],
  163. [0, 0, -2 / (zfar - znear), tz],
  164. [0, 0, 0, 1]]);
  165. }