ObJS.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. var backColor = "rgba(200, 200, 200, 1)";
  2. var vertColor = "rgba(10, 10, 10, 1)";
  3. var edgeColor = "rgba(200, 0, 0, 1)";
  4. var faceColor = "rgba(180, 180, 255, .5)";
  5. var textColor = "rgba(0, 0, 0, 1)";
  6. var vertSize = 6; //Make it even
  7. var scale = 50;
  8. var mDown = false;
  9. var canvas;
  10. var ctx;
  11. var obj;
  12. var vert;
  13. var face;
  14. var dVerts = true;
  15. var dEdges = true;
  16. var dFaces = true;
  17. var pX = null;
  18. var pY = null;
  19. function drawElement(name, value){
  20. switch (name){
  21. case "verts":
  22. dVerts = value;
  23. break;
  24. case "edges":
  25. dEdges = value;
  26. break;
  27. case "faces":
  28. dFaces = value;
  29. break;
  30. }
  31. draw();
  32. }
  33. function loadModel(val){
  34. //Get file
  35. xmlhttp = new XMLHttpRequest();
  36. xmlhttp.open("GET","/obj/" + val.value + ".obj", false);
  37. xmlhttp.send();
  38. var fileContent = xmlhttp.responseText;
  39. initArrays();
  40. readVerts(fileContent);
  41. readFaces(fileContent);
  42. draw();
  43. writeCredits();
  44. }
  45. function initArrays(){
  46. obj = null;
  47. vert = null;
  48. face = null;
  49. obj = new Array();
  50. vert = new Array();
  51. face = new Array();
  52. }
  53. function readVerts(text){
  54. var line;
  55. var i = 0;
  56. while (text.indexOf("v ") != -1){
  57. line = text.substring(text.indexOf("v "), text.indexOf("\n", text.indexOf("v ")));
  58. vert[i] = new Array(3);
  59. line = line.substring(2);
  60. vert[i][0] = scale * Math.round(line.substring(0, line.indexOf(" ")));
  61. line = line.substring(line.indexOf(" ") + 1);
  62. vert[i][1] = scale * Math.round(line.substring(0, line.indexOf(" ")));
  63. line = line.substring(line.indexOf(" ") + 1);
  64. vert[i][2] = scale * Math.round(line);
  65. i = i + 1;
  66. text = text.substring(text.indexOf("v ") + 1)
  67. }
  68. }
  69. function readFaces(text){
  70. var finish = false;
  71. var line;
  72. var i = 0;
  73. var j;
  74. while (text.indexOf("f ") != -1){
  75. line = text.substring(text.indexOf("f "), text.indexOf("\n", text.indexOf("f ")));
  76. line = line.substring(2);
  77. face[i] = new Array();
  78. j = 0;
  79. while(line.indexOf(" ") != -1){
  80. face[i][j] = line.substring(0, line.indexOf(" ")) - 1;
  81. line = line.substring(line.indexOf(" ") + 1);
  82. j = j + 1;
  83. }
  84. face[i][j] = line - 1;
  85. i = i + 1;
  86. text = text.substring(text.indexOf("f ") + 1)
  87. }
  88. }
  89. function drawVerts(){
  90. ctx.fillStyle = vertColor;
  91. var x;
  92. var y;
  93. var w;
  94. var h;
  95. for (var i = 0; i < vert.length; i++) {
  96. x = vert[i][0] - (vertSize / 2);
  97. w = vertSize;
  98. y = vert[i][1] - (vertSize / 2);
  99. h = vertSize;
  100. ctx.fillRect(x, y, w, h);
  101. }
  102. }
  103. function drawFaces(){
  104. for (var i = 0; i < face.length; i++){
  105. ctx.fillStyle = edgeColor;
  106. ctx.beginPath();
  107. ctx.moveTo(vert[face[i][0]][0], vert[face[i][0]][1]);
  108. for (var j = 1; j < face[i].length; j++) {
  109. ctx.lineTo(vert[face[i][j]][0], vert[face[i][j]][1]);
  110. if(dEdges)
  111. ctx.stroke();
  112. }
  113. ctx.closePath();
  114. ctx.fillStyle = faceColor;
  115. if(dFaces)
  116. ctx.fill();
  117. }
  118. }
  119. function draw(){
  120. initCanvas();
  121. drawFaces();
  122. if (dVerts)
  123. drawVerts();
  124. }
  125. function rotateY(theta) {
  126. var sin_t = Math.sin(theta / 100);
  127. var cos_t = Math.cos(theta / 100);
  128. for (var i=0; i<vert.length; i++) {
  129. var x = vert[i][0];
  130. var z = vert[i][2];
  131. vert[i][0] = x * cos_t - z * sin_t;
  132. vert[i][2] = z * cos_t + x * sin_t;
  133. }
  134. };
  135. function rotateX(theta) {
  136. var sin_t = Math.sin(theta / 100);
  137. var cos_t = Math.cos(theta / 100);
  138. for (var i=0; i<vert.length; i++) {
  139. var y = vert[i][1];
  140. var z = vert[i][2];
  141. vert[i][1] = y * cos_t - z * sin_t;
  142. vert[i][2] = z * cos_t + y * sin_t;
  143. }
  144. };
  145. function initCanvas(){
  146. if (canvas == null){
  147. canvas = document.getElementById("ObJSCanvas");
  148. ctx = canvas.getContext("2d");
  149. ctx.translate(canvas.width / 2, canvas.height / 2);
  150. canvas.onmousedown = function(e){
  151. pX = e.offsetX==undefined?e.layerX:e.offsetX;
  152. pY = e.offsetY==undefined?e.layerY:e.offsetY;
  153. mDown = true;
  154. }
  155. canvas.onmouseup = function(e){
  156. if(mDown) mouseClick(e);
  157. pX = null;
  158. pY = null;
  159. mDown = false;
  160. }
  161. canvas.onmousemove = function(e){
  162. if(!mDown) return;
  163. var x = e.offsetX==undefined?e.layerX:e.offsetX;
  164. var y = e.offsetY==undefined?e.layerY:e.offsetY;
  165. rotateY(x - pX);
  166. rotateX(y - pY);
  167. pX = x;
  168. pY = y;
  169. draw();
  170. return false;
  171. }
  172. }
  173. ctx.clearRect(0, 0, canvas.width, canvas.height);
  174. ctx.fillStyle = backColor;
  175. ctx.fillRect(-canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height);
  176. }
  177. function mouseClick(){
  178. //TODO: Element clicked
  179. }
  180. function writeCredits(){
  181. ctx.fillStyle = textColor;
  182. ctx.font = "12px Arial";
  183. var h = canvas.height / 2 - 14;
  184. var w = canvas.width / 2 - 45;
  185. ctx.fillText("ObJS", w, h);
  186. }