Дополнения к МУРОМУ | MUROM additions
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

295 行
7.2KB

  1. // ==== ENGLISH API ====
  2. // Subscribe several functions in a single call.
  3. Reporter.prototype.subscribeMany = function(funcs)
  4. {
  5. for (var i = 0; i < funcs.length; ++i)
  6. {
  7. var func = funcs[i];
  8. this.subscribe(func);
  9. }
  10. }
  11. murom.getMany = function(items, completionCallback)
  12. {
  13. var self = this;
  14. var results = {};
  15. var count = 0;
  16. function reportCompletion()
  17. {
  18. if (++count == items.length)
  19. {
  20. if (completionCallback)
  21. {
  22. completionCallback(results);
  23. }
  24. }
  25. }
  26. for (var id in items)
  27. {
  28. const item = items[id];
  29. const url = item[0];
  30. const name = item[1];
  31. var isBinary = (item[2] == "b");
  32. function success(contents)
  33. {
  34. results[name] = contents;
  35. reportCompletion()
  36. }
  37. function failure(status)
  38. {
  39. LOG(
  40. formatString(
  41. "ERROR Could not download URL: '{0}' status: '{1}'",
  42. url,
  43. status
  44. )
  45. );
  46. reportCompletion()
  47. }
  48. if (isBinary)
  49. {
  50. murom.getb(url, success, failure);
  51. }
  52. else
  53. {
  54. murom.get(url, success, failure);
  55. }
  56. }
  57. };
  58. // ==== РУССКИЙ API ====
  59. // Вне классов.
  60. // JavaScript equivalent to printf/String.Format
  61. // https://stackoverflow.com/a/4673436
  62. function форматСтроки() {
  63. // How to shift “arguments”
  64. // https://stackoverflow.com/questions/4775895/how-to-shift-arguments
  65. var args = Array.prototype.slice.call(arguments);
  66. var str = args.shift();
  67. return str.replace(/{(\d+)}/g, function(match, number) {
  68. return typeof args[number] != 'undefined'
  69. ? args[number]
  70. : match
  71. ;
  72. });
  73. }
  74. // Уведомитель.
  75. var Уведомитель = Reporter;
  76. Reporter.prototype.уведомить = function()
  77. {
  78. this.report();
  79. };
  80. Reporter.prototype.подписать = function(функция)
  81. {
  82. this.subscribe(функция);
  83. };
  84. // Подписать сразу несколько функций за один вызов.
  85. Reporter.prototype.подписатьМного = function(funcs)
  86. {
  87. this.subscribeMany(funcs);
  88. };
  89. var муром = {};
  90. // Камера.
  91. муром.камера = {};
  92. Object.defineProperty(муром.камера, "цветОчистки", {
  93. get: function()
  94. {
  95. return murom.camera.clearColor;
  96. },
  97. set: function(values)
  98. {
  99. murom.camera.clearColor = values;
  100. }
  101. });
  102. Object.defineProperty(муром.камера, "позиция", {
  103. get: function()
  104. {
  105. return murom.camera.position;
  106. },
  107. set: function(values)
  108. {
  109. murom.camera.position = values;
  110. }
  111. });
  112. Object.defineProperty(муром.камера, "вращение", {
  113. get: function()
  114. {
  115. return murom.camera.rotation;
  116. },
  117. set: function(values)
  118. {
  119. murom.camera.rotation = values;
  120. }
  121. });
  122. муром.камера.узелВПозиции = function(позиция, маска)
  123. {
  124. return murom.camera.nodeAtPosition(позиция, маска);
  125. };
  126. // Мышь.
  127. муром.мышь = {};
  128. Object.defineProperty(муром.мышь, "нажатыеКнопки", {
  129. get: function()
  130. {
  131. return murom.mouse.pressedButtons;
  132. }
  133. });
  134. Object.defineProperty(муром.мышь, "позиция", {
  135. get: function()
  136. {
  137. return murom.mouse.position;
  138. }
  139. });
  140. муром.мышь.позицияИзменилась = new Уведомитель();
  141. murom.mouse.positionChanged.subscribe(function(){
  142. муром.мышь.позицияИзменилась.уведомить();
  143. });
  144. муром.мышь.нажатыеКнопкиИзменились = new Уведомитель();
  145. murom.mouse.pressedButtonsChanged.subscribe(function(){
  146. муром.мышь.нажатыеКнопкиИзменились.уведомить();
  147. });
  148. // Узел.
  149. Object.defineProperty(Node.prototype, "имя", {
  150. get: function()
  151. {
  152. return this.name;
  153. }
  154. });
  155. Object.defineProperty(Node.prototype, "позиция", {
  156. get: function()
  157. {
  158. return this.position;
  159. },
  160. set: function(values)
  161. {
  162. this.position = values;
  163. }
  164. });
  165. Object.defineProperty(Node.prototype, "вращение", {
  166. get: function()
  167. {
  168. return this.rotation;
  169. },
  170. set: function(values)
  171. {
  172. this.rotation = values;
  173. }
  174. });
  175. Node.prototype.добавитьДитя = function(дитя)
  176. {
  177. this.addChild(дитя);
  178. };
  179. Node.prototype.задатьМаску = function(маска)
  180. {
  181. this.setMask(маска);
  182. };
  183. Node.prototype.задатьМатериал = function(материал)
  184. {
  185. this.setMaterial(материал);
  186. };
  187. // Узлы.
  188. муром.узлы = {};
  189. муром.узлы.узел = function(имя)
  190. {
  191. return murom.nodes.node(имя);
  192. };
  193. муром.узлы.создатьСферу = function(имя, радиус)
  194. {
  195. return murom.nodes.createSphere(имя, радиус);
  196. };
  197. муром.узлы.создатьУзел = function(имя, модель)
  198. {
  199. return murom.nodes.createNode(имя, модель);
  200. };
  201. // Материал.
  202. Material.prototype.задатьШейдеры = function(вершинный, фрагментный)
  203. {
  204. this.setShaders(вершинный, фрагментный);
  205. };
  206. Material.prototype.задатьЮниформ = function(имя, значение)
  207. {
  208. this.setUniform(имя, значение)
  209. };
  210. Material.prototype.задатьТекстуру = function(имяЮниформа, текстура)
  211. {
  212. this.setTexture(имяЮниформа, текстура)
  213. };
  214. // Материалы.
  215. муром.материалы = {};
  216. муром.материалы.создатьМатериал = function(имя)
  217. {
  218. return murom.materials.createMaterial(имя);
  219. };
  220. // Ресурс.
  221. Object.defineProperty(Resource.prototype, "имя", {
  222. get: function()
  223. {
  224. return this.name;
  225. }
  226. });
  227. Object.defineProperty(Resource.prototype, "содержимое", {
  228. get: function()
  229. {
  230. return this.contents;
  231. }
  232. });
  233. // Ресурсы.
  234. муром.ресурсы = {};
  235. муром.ресурсы.получить = function(ресурсы, отклик)
  236. {
  237. murom.resources.get(ресурсы, отклик);
  238. };
  239. муром.ресурсы.ресурс = function(имя)
  240. {
  241. return murom.resources.resource(имя);
  242. };
  243. муром.ресурсы.создатьРесурс = function(имя, содержимое)
  244. {
  245. return murom.resources.createResource(имя, содержимое);
  246. };
  247. // Функции.
  248. муром.получить = function(адрес, откликУспеха, откликПровала)
  249. {
  250. murom.get(адрес, откликУспеха, откликПровала);
  251. };
  252. муром.получитьб = function(адрес, откликУспеха, откликПровала)
  253. {
  254. murom.getb(адрес, откликУспеха, откликПровала);
  255. };
  256. муром.получитьМного = function(элементы, откликЗавершения)
  257. {
  258. murom.getMany(элементы, откликЗавершения);
  259. };