Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.27 KB | None | 0 0
  1. // ==UserScript==
  2. // @name sketchfab
  3. // @version 0.1
  4. // @description download sketchfab models
  5. // @author tianye
  6. // @include /^https?://(www\.)?sketchfab\.com/.*
  7. // @run-at document-start
  8. // @grant unsafeWindow
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13. var window = unsafeWindow;
  14. console.log("[UserScript]init", window);
  15.  
  16. var savestring = function(filename, str) {
  17. var textblob = new Blob([str], {type:'text/plain'});
  18.  
  19. var link = document.createElement('a');
  20. link.download = filename;
  21. link.innerHTML = 'Download File';
  22. link.href = window.URL.createObjectURL(textblob);
  23. link.onclick = function(e) {
  24. document.body.removeChild(e.target);
  25. };
  26. link.style.display = 'none';
  27. document.body.appendChild(link);
  28.  
  29. link.click();
  30. console.log("[UserScript]savestring", filename);
  31. }
  32.  
  33. var saveimagecache = {};
  34. var saveimage = function(filename, url) {
  35. if (!saveimagecache[url]) {
  36. saveimagecache[url] = true;
  37.  
  38. var link = document.createElement('a');
  39. link.download = filename;
  40. link.innerHTML = 'Download File';
  41. link.href = url;
  42. link.target = '_blank';
  43. link.onclick = function(e) {
  44. document.body.removeChild(e.target);
  45. };
  46. document.body.appendChild(link);
  47.  
  48. link.click();
  49. }
  50. console.log("[UserScript]saveimage", filename);
  51. }
  52.  
  53. var dosavefile = function(mdl) {
  54. var obj = mdl.obj;
  55. var str = '';
  56. str += 'mtllib ' + mdl.name + '.mtl\n';
  57. str += 'o ' + mdl.name + '\n';
  58. for (var i = 0; i < obj.vertex.length; i += 3) {
  59. str += 'v ';
  60. for (var j = 0; j < 3; ++j) {
  61. str += obj.vertex[i + j] + ' ';
  62. }
  63. str += '\n';
  64. }
  65. for (i = 0; i < obj.normal.length; i += 3) {
  66. str += 'vn ';
  67. for (j = 0; j < 3; ++j) {
  68. str += obj.normal[i + j] + ' ';
  69. }
  70. str += '\n';
  71. }
  72. for (i = 0; i < obj.uv.length; i += 2) {
  73. str += 'vt ';
  74. for (j = 0; j < 2; ++j) {
  75. str += obj.uv[i + j] + ' ';
  76. }
  77. str += '\n';
  78. }
  79. str += 'usemtl ' + mdl.name + '\n';
  80. str += 's on \n';
  81.  
  82. var vn = obj.normal.length != 0;
  83. var vt = obj.uv.length != 0;
  84.  
  85. for (i = 0; i < obj.primitives.length; ++i) {
  86. var primitive = obj.primitives[i];
  87. if (primitive.mode == 4 || primitive.mode == 5) {
  88. var strip = (primitive.mode == 5);
  89. for (j = 0; j + 2 < primitive.indices.length; !strip ? j += 3 : j++) {
  90. str += 'f ';
  91. var order = [ 0, 1, 2];
  92. if (strip && (j % 2 == 1)) {
  93. order = [ 0, 2, 1];
  94. }
  95. for (var k = 0; k < 3; ++k) {
  96. var faceNum = primitive.indices[j + order[k]] + 1;
  97. str += faceNum;
  98. if (vn || vt) {
  99. str += '/';
  100. if (vt) {
  101. str += faceNum;
  102. }
  103. if (vn) {
  104. str += '/' + faceNum;
  105. }
  106. }
  107. str += ' ';
  108. }
  109. str += '\n';
  110. }
  111. }
  112. else {
  113. console.log("[UserScript]dosavefile: unknown primitive mode", primitive);
  114. }
  115. }
  116. savestring(mdl.name+".obj", str);
  117.  
  118. var tex = mdl.tex;
  119. var mtl = '';
  120. mtl += 'newmtl ' + mdl.name + '\n';
  121. tex.forEach(function(texture) {
  122. mtl += texture.type + ' ' + texture.filename + '\n';
  123. saveimage(texture.filename, texture.url);
  124. });
  125. savestring(mdl.name+".mtl", mtl);
  126. }
  127.  
  128. var parseobj = function(obj) {
  129. var list = [];
  130. obj._primitives.forEach(function(p) {
  131. if(p && p.indices) {
  132. list.push({
  133. 'mode' : p.mode,
  134. 'indices' : p.indices._elements
  135. });
  136. }
  137. })
  138.  
  139. var attr = obj._attributes;
  140. return {
  141. vertex: attr.Vertex._elements,
  142. normal: attr.Normal ? attr.Normal._elements : [],
  143. uv: attr.TexCoord0 ? attr.TexCoord0._elements : [],
  144. primitives: list,
  145. };
  146. }
  147.  
  148. var textype = {
  149. DiffusePBR: "map_Kd",
  150. DiffuseColor: "map_Kd",
  151. SpecularPBR: "map_Ks",
  152. SpecularColor: "map_Ks",
  153. GlossinessPBR: "map_Pm",
  154. NormalMap : "map_bump",
  155. EmitColor : "map_Ke",
  156. AlphaMask : "map_d",
  157. Opacity : "map_o"
  158. };
  159.  
  160. var parsetex = function(obj) {
  161. var texlist = [];
  162. var stateset = obj._parents[0].stateset;
  163. if (stateset && stateset._textureAttributeArrayList) {
  164. stateset._textureAttributeArrayList.forEach(function(arr) {
  165. if (arr && arr[0]&& arr[0]._object) {
  166. var object = arr[0]._object;
  167. var image = object._texture && object._texture._image
  168. if (image && image._url) {
  169. var type = textype[object._channels[0]] || object._channelName || "map_Kd";
  170.  
  171. texlist.push({
  172. url: image._url,
  173. type: type,
  174. filename:new String(image._url).substring(image._url.lastIndexOf('/') + 1)
  175. });
  176. } else {
  177. var packed = object._packedTextures;
  178. if (packed) {
  179. object._channels.forEach(function(channel) {
  180. var type = textype[channel] || "map_Kd";
  181. var image = packed[channel] && packed[channel].texture && packed[channel].texture._image;
  182. if (image && image._url) {
  183. texlist.push({
  184. url: image._url,
  185. type: type,
  186. filename:new String(image._url).substring(image._url.lastIndexOf('/') + 1)
  187. });
  188. }
  189. });
  190. }
  191. }
  192. }
  193. });
  194. }
  195. return texlist;
  196. }
  197.  
  198. var dodownload = function() {
  199. console.log("[UserScript]download");
  200. window.allmodel.forEach(function(obj) {
  201. var mdl = {
  202. name: obj._name,
  203. obj:parseobj(obj),
  204. tex:parsetex(obj),
  205. }
  206.  
  207. dosavefile(mdl);
  208. })
  209. }
  210.  
  211. var addbtnfunc = function() {
  212. var p = document.evaluate("//div[@class='titlebar']", document, null, 9, null).singleNodeValue;
  213. if(p) {
  214. console.log("[UserScript]add btn");
  215. var btn = document.createElement("a");
  216. btn.setAttribute("class", "control");
  217. btn.innerHTML = "<pre style='color:red;'>DOWNLOAD</pre>";
  218. btn.addEventListener("click", dodownload , false);
  219. p.appendChild(btn);
  220. } else {
  221. console.log("[UserScript]try add btn later");
  222. //setTimeout(addbtnfunc, 1000);
  223. }
  224. }
  225. setTimeout(addbtnfunc, 3000);
  226.  
  227. window.allmodel = [];
  228. window.drawhook = function(obj) {
  229. if(obj._faked != true) {
  230. obj._faked = true;
  231. window.allmodel.push(obj)
  232. console.log(obj);
  233. }
  234. }
  235. window.addEventListener('beforescriptexecute', function(e) {
  236. var src = e.target.src;
  237. if((""+src).length == 0) {
  238. return;
  239. }
  240. console.log("[UserScript]load script: " + src);
  241.  
  242. if (src.indexOf("web/dist/viewer") >= 0) {
  243. e.preventDefault();
  244. e.stopPropagation();
  245.  
  246. var req = new XMLHttpRequest();
  247. req.open('GET', src, false);
  248. req.send('');
  249.  
  250. var jstext = req.responseText;
  251. if (jstext.indexOf("drawImplementation:function(e){var t=e.getLastProgramApplied()") >= 0) {
  252. jstext = jstext.split("drawImplementation:function(e){var t=e.getLastProgramApplied()").join("drawImplementation:function(e){window.drawhook(this);var t=e.getLastProgramApplied()");
  253. } else {
  254. jstext = jstext.split("drawImplementation: function(state) {").join("drawImplementation: function(state) { window.drawhook(this);");
  255. }
  256.  
  257. var obj = document.createElement('script');
  258. obj.type = "text/javascript";
  259. obj.text = jstext;
  260. document.getElementsByTagName('head')[0].appendChild(obj);
  261.  
  262. console.log("[UserScript]Injection: viewer.js patched");
  263. };
  264. }, true);
  265. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement