Source: extern/material.js

  1. import register from "../util/register.js";
  2. import m_batch_fact from "../intern/batch.js";
  3. import m_cfg_fact from "../intern/config.js";
  4. import m_geom_fact from "../intern/geometry.js";
  5. import m_obj_fact from "../intern/objects.js";
  6. import m_obj_util_fact from "../intern/obj_util.js";
  7. import m_print_fact from "../intern/print.js";
  8. import m_shaders_fact from "../intern/shaders.js";
  9. import * as m_util from "../intern/util.js";
  10. import m_scenes_fact from "../intern/scenes.js";
  11. /**
  12. * Material API.
  13. * Contains methods to control parameters of materials.
  14. * @module material
  15. * @local LineParams
  16. * @local MaterialExtParams
  17. * @local WaterMaterialParams
  18. */
  19. function Material(ns, exports) {
  20. var m_batch = m_batch_fact(ns);
  21. var m_cfg = m_cfg_fact(ns);
  22. var m_geom = m_geom_fact(ns);
  23. var m_obj = m_obj_fact(ns);
  24. var m_obj_util = m_obj_util_fact(ns);
  25. var m_print = m_print_fact(ns);
  26. var m_shaders = m_shaders_fact(ns);
  27. var m_scenes = m_scenes_fact(ns);
  28. var cfg_def = m_cfg.defaults;
  29. /**
  30. * Line params.
  31. * @typedef {Object} LineParams
  32. * @property {RGBA} [color] Line diffuse color
  33. * @property {number} [width] Line width in pixels
  34. * @cc_externs color width
  35. */
  36. /**
  37. * Additional group of parameters for a non-node material.
  38. * @typedef {Object} MaterialExtParams
  39. * @property {number} [fresnel] Power of Fresnel for mirror reflection.
  40. * @property {number} [fresnel_factor] Blending factor for Fresnel.
  41. * @property {number} [parallax_scale] Scale parameter for texture wrapping.
  42. * Available if the parallax effect is enabled on the material's normal map texture.
  43. * @property {number} [parallax_steps] Number of steps taken to build a parallax surface.
  44. * Available if the parallax effect is enabled on the material's normal map texture.
  45. * @property {number} [reflect_factor] Amount of mirror reflection.
  46. * @cc_externs fresnel fresnel_factor parallax_scale parallax_steps reflect_factor
  47. */
  48. /**
  49. * Parameters for a water material.
  50. * @typedef {Object} WaterMaterialParams
  51. * @property {boolean} [shore_smoothing] Perform the smoothing between the water
  52. * and the shore objects. Can be used only for Add, Alpha Blend and Alpha Sort
  53. * materials.
  54. * @property {number} [absorb_factor] Water absorb factor. Used only if the
  55. * "shore_smoothing" parameter is true for this material.
  56. * @property {number} [foam_factor] Water foam intensity factor. Can be used if
  57. * there is a foam texture in this material.
  58. * @property {RGB} [shallow_water_col] Color of the shallow water.
  59. * @property {RGB} [shore_water_col] Color of the shore water.
  60. * @property {number} [shallow_water_col_fac] Shallow water color factor.
  61. * @property {number} [shore_water_col_fac] Shore water color factor.
  62. * @property {number} [norm_uv_velocity] Water normalmap UV velocity. Can be used
  63. * if there is a normalmap texture in this material.
  64. * @property {boolean} [water_dynamic] Dynamic water surface. If disabled in the
  65. * blend-file, then this option cannot be enabled via API.
  66. * @property {number} [sss_strength] Strength of subsurface scattering. Used if
  67. * the "water_dynamic" parameter is true.
  68. * @property {number} [sss_width] Width of subsurface scattering. Used if the
  69. * "water_dynamic" parameter is true.
  70. * @property {number} [waves_height] Waves height. Used if the "water_dynamic"
  71. * parameter is true.
  72. * @property {number} [waves_length] Waves length. Used if the "water_dynamic"
  73. * parameter is true.
  74. * @property {number} [dst_noise_scale0] Distant waves noise scale (first
  75. * component). Used if the "water_dynamic" parameter is true.
  76. * @property {number} [dst_noise_scale1] Distant waves noise scale (second
  77. * component). Used if the "water_dynamic" parameter is true.
  78. * @property {number} [dst_noise_freq0] Distant waves noise frequency (first
  79. * component). Used if the "water_dynamic" parameter is true.
  80. * @property {number} [dst_noise_freq1] Distant waves noise frequency (second
  81. * component). Used if the "water_dynamic" parameter is true.
  82. * @property {number} [dir_min_shore_fac] Minimum shore factor for directional
  83. * waves. Used if the "water_dynamic" parameter is true.
  84. * @property {number} [dir_freq] Directional waves frequency. Used if the
  85. * "water_dynamic" parameter is true.
  86. * @property {number} [dir_noise_scale] Directional waves noise scale. Used if the
  87. * "water_dynamic" parameter is true.
  88. * @property {number} [dir_noise_freq] Directional waves noise frequency. Used if
  89. * the"water_dynamic" parameter is true.
  90. * @property {number} [dir_min_noise_fac] Directional waves minimum noise factor.
  91. * Used if the "water_dynamic" parameter is true.
  92. * @property {number} [dst_min_fac] Distant waves min factor. Used if the
  93. * "water_dynamic" parameter is true.
  94. * @property {number} [waves_hor_fac] Strength of horizontal waves inclination.
  95. * Used if the "water_dynamic" parameter is true.
  96. * @cc_externs shore_smoothing absorb_factor foam_factor shallow_water_col
  97. * @cc_externs shore_water_col shallow_water_col_fac shore_water_col_fac
  98. * @cc_externs sss_strength sss_width norm_uv_velocity water_dynamic
  99. * @cc_externs waves_height waves_length dst_noise_scale0 dst_noise_scale1
  100. * @cc_externs dst_noise_freq0 dst_noise_freq1 dir_min_shore_fac dir_freq
  101. * @cc_externs dir_noise_scale dir_noise_freq dir_min_noise_fac dst_min_fac
  102. * @cc_externs waves_hor_fac
  103. */
  104. /**
  105. * Inherit the batch material from another object.
  106. * @method module:material.inherit_material
  107. * @param {Object3D} obj_from Source Object 3D
  108. * @param {string} mat_from_name Source material name
  109. * @param {Object3D} obj_to Destination Object 3D
  110. * @param {string} mat_to_name Destination material name
  111. * @example
  112. * var m_mat = require("material");
  113. * var m_scenes = require("scenes");
  114. *
  115. * var cube = m_scenes.get_object_by_name("Cube");
  116. * var cube_001 = m_scenes.get_object_by_name("Cube.001");
  117. * m_mat.inherit_material(cube, "MyMaterial_1", cube_001, "MyMaterial_2");
  118. */
  119. exports.inherit_material = function(obj_from, mat_from_name, obj_to, mat_to_name) {
  120. if (!m_geom.has_dyn_geom(obj_to) || !m_geom.has_dyn_geom(obj_from)) {
  121. m_print.error("inherit_material(): both objects \""
  122. + obj_from.origin_name + "\" and \"" + obj_to.origin_name
  123. + "\" must have the \"Dynamic Geometry & Materials\" flag enabled.");
  124. return;
  125. }
  126. var bpy_mat_from_index = obj_from.mat_inheritance_data.original_mat_names.indexOf(mat_from_name);
  127. if (bpy_mat_from_index == -1) {
  128. m_print.error("inherit_material(): material \"" + mat_from_name
  129. + "\" not found on the object \"" + obj_from.origin_name + "\".");
  130. return;
  131. }
  132. var bpy_mat_to_index = obj_to.mat_inheritance_data.original_mat_names.indexOf(mat_to_name);
  133. if (bpy_mat_to_index == -1) {
  134. m_print.error("inherit_material(): material \"" + mat_to_name
  135. + "\" not found on the object \"" + obj_to.origin_name + "\".");
  136. return;
  137. }
  138. if (obj_to._bpy_obj["data"]["submeshes"][bpy_mat_to_index]["shade_tangs"].length == 0
  139. && obj_from.materials[bpy_mat_from_index].use_tangent_shading) {
  140. m_print.warn("The target material \"" + mat_to_name + "\" was exported "
  141. + "without tangent shading data. However, the \"" + mat_from_name
  142. + "\" material requires it. It's needed to enable the \"Tangent Shading\" "
  143. + "option on the target material for correct rendering.");
  144. }
  145. m_obj.inherit_material(obj_from, mat_from_name, obj_to, mat_to_name);
  146. }
  147. /**
  148. * Get materials' names for the given object.
  149. * @method module:material.get_materials_names
  150. * @param {Object3D} obj Object 3D
  151. * @returns {string[]} Array of materials' names
  152. * @example var m_scenes = require("scenes");
  153. * var m_mat = require("material");
  154. *
  155. * var cube = m_scenes.get_object_by_name("Cube");
  156. * var material_list = m_mat.get_materials_names(cube);
  157. */
  158. exports.get_materials_names = function(obj) {
  159. var mat_names = [];
  160. if (!m_obj_util.is_dynamic_mesh(obj)) {
  161. m_print.error("get_materials_names(): Object \"" + obj.name
  162. + "\" is not a dynamic MESH.");
  163. return mat_names;
  164. }
  165. var scenes_data = obj.scenes_data;
  166. for (var i = 0; i < scenes_data.length; i++) {
  167. var batches = scenes_data[i].batches;
  168. for (var j = 0; j < batches.length; j++) {
  169. var batch = batches[j];
  170. if (batch.type == "MAIN")
  171. for (var k = 0; k < batch.material_names.length; k++)
  172. if (mat_names.indexOf(batch.material_names[k]) == -1)
  173. mat_names.push(batch.material_names[k]);
  174. }
  175. }
  176. return mat_names;
  177. }
  178. /**
  179. * Set the diffuse color and alpha for the object non-node material.
  180. * @method module:material.set_diffuse_color
  181. * @param {Object3D} obj Object 3D
  182. * @param {string} mat_name Material name
  183. * @param {RGBA} color Color+alpha vector
  184. * @example
  185. * var m_mat = require("material");
  186. * var m_scenes = require("scenes");
  187. * var m_rgba = require("rgba");
  188. *
  189. * var cube = m_scenes.get_object_by_name("Cube");
  190. * m_mat.set_diffuse_color(cube, "MyMaterial", m_rgba.from_values(1.0, 0.0, 0.0, 1.0));
  191. */
  192. exports.set_diffuse_color = function(obj, mat_name, color) {
  193. if (!m_obj_util.is_dynamic_mesh(obj)) {
  194. m_print.error("set_diffuse_color(): Object \"" + obj.name
  195. + "\" is not a dynamic MESH.");
  196. return;
  197. }
  198. // TODO: check why there is only MAIN
  199. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  200. if (!batch) {
  201. m_print.error("set_diffuse_color(): Material \"" + mat_name
  202. + "\" wasn't found on the object \"" + obj.name + "\".");
  203. return;
  204. }
  205. if (batch.has_nodes) {
  206. m_print.error("set_diffuse_color(): Not allowed for node materials! "
  207. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  208. return;
  209. }
  210. batch.diffuse_color.set(color);
  211. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  212. if (reflect_batch)
  213. reflect_batch.diffuse_color.set(color);
  214. }
  215. /**
  216. * Get the diffuse color and alpha for the object non-node material.
  217. * @method module:material.get_diffuse_color
  218. * @param {Object3D} obj Object 3D
  219. * @param {string} mat_name Material name
  220. * @returns {RGBA} Material diffuse color+alpha
  221. * @example var m_scenes = require("scenes");
  222. * var m_mat = require("material");
  223. *
  224. * var cube = m_scenes.get_object_by_name("Cube");
  225. * var diffuse_color = m_mat.get_diffuse_color(cube, "MyMaterial");
  226. */
  227. exports.get_diffuse_color = function(obj, mat_name) {
  228. var color = new Float32Array(4);
  229. if (!m_obj_util.is_dynamic_mesh(obj)) {
  230. m_print.error("get_diffuse_color(): Object \"" + obj.name
  231. + "\" is not a dynamic MESH.");
  232. return color;
  233. }
  234. // TODO: check why there is only MAIN
  235. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  236. if (!batch) {
  237. m_print.error("get_diffuse_color(): Material \"" + mat_name
  238. + "\" wasn't found on the object \"" + obj.name + "\".");
  239. return color;
  240. }
  241. if (batch.has_nodes) {
  242. m_print.error("get_diffuse_color(): Not allowed for node materials! "
  243. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  244. return color;
  245. }
  246. color.set(batch.diffuse_color);
  247. return color;
  248. }
  249. /**
  250. * Set the diffuse color intensity for the object non-node material.
  251. * @method module:material.set_diffuse_intensity
  252. * @param {Object3D} obj Object 3D
  253. * @param {string} mat_name Material name
  254. * @param {number} intensity Diffuse intensity value
  255. * @example var m_scenes = require("scenes");
  256. * var m_mat = require("material");
  257. *
  258. * var cube = m_scenes.get_object_by_name("Cube");
  259. * m_mat.set_diffuse_intensity(cube, "MyMaterial", 0.5);
  260. */
  261. exports.set_diffuse_intensity = function(obj, mat_name, intensity) {
  262. if (!m_obj_util.is_dynamic_mesh(obj)) {
  263. m_print.error("set_diffuse_intensity(): Object \"" + obj.name
  264. + "\" is not a dynamic MESH.");
  265. return;
  266. }
  267. // TODO: check why there is only MAIN
  268. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  269. if (!batch) {
  270. m_print.error("set_diffuse_intensity(): Material \"" + mat_name
  271. + "\" wasn't found on the object \"" + obj.name + "\".");
  272. return;
  273. }
  274. if (batch.has_nodes) {
  275. m_print.error("set_diffuse_intensity(): Not allowed for node materials! "
  276. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  277. return;
  278. }
  279. batch.diffuse_intensity = intensity;
  280. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  281. if (reflect_batch)
  282. reflect_batch.diffuse_intensity = intensity;
  283. }
  284. /**
  285. * Get the diffuse color intensity for the object non-node material.
  286. * @method module:material.get_diffuse_intensity
  287. * @param {Object3D} obj Object 3D
  288. * @param {string} mat_name Material name
  289. * @returns {number} Diffuse intensity value
  290. * @example var m_scenes = require("scenes");
  291. * var m_mat = require("material");
  292. *
  293. * var cube = m_scenes.get_object_by_name("Cube");
  294. * var diffuse_intensity = m_mat.get_diffuse_intensity(cube, "MyMaterial");
  295. */
  296. exports.get_diffuse_intensity = function(obj, mat_name) {
  297. if (!m_obj_util.is_dynamic_mesh(obj)) {
  298. m_print.error("get_diffuse_intensity(): Object \"" + obj.name
  299. + "\" is not a dynamic MESH.");
  300. return 0;
  301. }
  302. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  303. if (!batch) {
  304. m_print.error("get_diffuse_intensity(): Material \"" + mat_name
  305. + "\" wasn't found on the object \"" + obj.name + "\".");
  306. return 0;
  307. }
  308. if (batch.has_nodes) {
  309. m_print.error("get_diffuse_intensity(): Not allowed for node materials! "
  310. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  311. return 0;
  312. }
  313. return batch.diffuse_intensity;
  314. }
  315. /**
  316. * Set the specular color for the object non-node material.
  317. * @method module:material.set_specular_color
  318. * @param {Object3D} obj Object 3D
  319. * @param {string} mat_name Material name
  320. * @param {RGB} color Color vector
  321. * @example
  322. * var m_mat = require("material");
  323. * var m_scenes = require("scenes");
  324. *
  325. * var cube = m_scenes.get_object_by_name("Cube");
  326. * m_mat.set_specular_color(cube, "MyMaterial", [0, 0.8, 0]);
  327. */
  328. exports.set_specular_color = function(obj, mat_name, color) {
  329. if (!m_obj_util.is_dynamic_mesh(obj)) {
  330. m_print.error("set_specular_color(): Object \"" + obj.name
  331. + "\" is not a dynamic MESH.");
  332. return;
  333. }
  334. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  335. if (!batch) {
  336. m_print.error("set_specular_color(): Material \"" + mat_name
  337. + "\" wasn't found on the object \"" + obj.name + "\".");
  338. return;
  339. }
  340. if (batch.has_nodes) {
  341. m_print.error("set_specular_color(): Not allowed for node materials! "
  342. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  343. return;
  344. }
  345. batch.specular_color.set(color);
  346. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  347. if (reflect_batch)
  348. reflect_batch.specular_color.set(color);
  349. }
  350. /**
  351. * Get the specular color for the object non-node material.
  352. * @method module:material.get_specular_color
  353. * @param {Object3D} obj Object 3D
  354. * @param {string} mat_name Material name
  355. * @returns {RGB} Specular color
  356. * @example var m_scenes = require("scenes");
  357. * var m_mat = require("material");
  358. *
  359. * var cube = m_scenes.get_object_by_name("Cube");
  360. * var specular_color = m_mat.get_specular_color(cube, "MyMaterial");
  361. */
  362. exports.get_specular_color = function(obj, mat_name) {
  363. var color = new Float32Array(3);
  364. if (!m_obj_util.is_dynamic_mesh(obj)) {
  365. m_print.error("get_specular_color(): Object \"" + obj.name
  366. + "\" is not a dynamic MESH.");
  367. return color;
  368. }
  369. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  370. if (!batch) {
  371. m_print.error("get_specular_color(): Material \"" + mat_name
  372. + "\" wasn't found on the object \"" + obj.name + "\".");
  373. return color;
  374. }
  375. if (batch.has_nodes) {
  376. m_print.error("get_specular_color(): Not allowed for node materials! "
  377. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  378. return color;
  379. }
  380. color.set(batch.specular_color);
  381. return color;
  382. }
  383. /**
  384. * Set the specular color factor for the object non-node material.
  385. * @method module:material.set_specular_color_factor
  386. * @param {Object3D} obj Object 3D
  387. * @param {string} mat_name Material name
  388. * @param {number} factor Specular color factor
  389. * @example var m_scenes = require("scenes");
  390. * var m_mat = require("material");
  391. *
  392. * var cube = m_scenes.get_object_by_name("Cube");
  393. * m_mat.set_specular_color_factor(cube, "MyMaterial", 0.8);
  394. */
  395. exports.set_specular_color_factor = function(obj, mat_name, factor) {
  396. if (!m_obj_util.is_dynamic_mesh(obj)) {
  397. m_print.error("set_specular_color_factor(): Object \"" + obj.name
  398. + "\" is not a dynamic MESH.");
  399. return;
  400. }
  401. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  402. if (!batch) {
  403. m_print.error("set_specular_color_factor(): Material \"" + mat_name
  404. + "\" wasn't found on the object \"" + obj.name + "\".");
  405. return;
  406. }
  407. if (batch.has_nodes) {
  408. m_print.error("set_specular_color_factor(): Not allowed for node materials! "
  409. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  410. return;
  411. }
  412. batch.specular_color_factor = factor;
  413. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  414. if (reflect_batch)
  415. reflect_batch.specular_color_factor = factor;
  416. }
  417. /**
  418. * Get the specular color factor for the object non-node material.
  419. * @method module:material.get_specular_color_factor
  420. * @param {Object3D} obj Object 3D
  421. * @param {string} mat_name Material name
  422. * @returns {number} Specular color factor
  423. * @example var m_scenes = require("scenes");
  424. * var m_mat = require("material");
  425. *
  426. * var cube = m_scenes.get_object_by_name("Cube");
  427. * var specular_color_factor = m_mat.get_specular_color_factor(cube, "MyMaterial");
  428. */
  429. exports.get_specular_color_factor = function(obj, mat_name) {
  430. if (!m_obj_util.is_dynamic_mesh(obj)) {
  431. m_print.error("get_specular_color_factor(): Object \"" + obj.name
  432. + "\" is not a dynamic MESH.");
  433. return 0;
  434. }
  435. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  436. if (!batch) {
  437. m_print.error("get_specular_color_factor(): Material \"" + mat_name
  438. + "\" wasn't found on the object \"" + obj.name + "\".");
  439. return 0;
  440. }
  441. if (batch.has_nodes) {
  442. m_print.error("get_specular_color_factor(): Not allowed for node materials! "
  443. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  444. return 0;
  445. }
  446. return batch.specular_color_factor;
  447. }
  448. /**
  449. * Set the specular color intensity for the object non-node material.
  450. * @method module:material.set_specular_intensity
  451. * @param {Object3D} obj Object 3D
  452. * @param {string} mat_name Material name
  453. * @param {number} intensity Specular intensity value
  454. * @example
  455. * var m_mat = require("material");
  456. * var m_scenes = require("scenes");
  457. *
  458. * var cube = m_scenes.get_object_by_name("Cube");
  459. * m_mat.set_specular_intensity(cube, "MyMaterial", 0.7);
  460. */
  461. exports.set_specular_intensity = function(obj, mat_name, intensity) {
  462. if (!m_obj_util.is_dynamic_mesh(obj)) {
  463. m_print.error("set_specular_intensity(): Object \"" + obj.name
  464. + "\" is not a dynamic MESH.");
  465. return;
  466. }
  467. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  468. if (!batch) {
  469. m_print.error("set_specular_intensity(): Material \"" + mat_name
  470. + "\" wasn't found on the object \"" + obj.name + "\".");
  471. return;
  472. }
  473. if (batch.has_nodes) {
  474. m_print.error("set_specular_intensity(): Not allowed for node materials! "
  475. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  476. return;
  477. }
  478. batch.specular_params[0] = intensity;
  479. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  480. if (reflect_batch)
  481. reflect_batch.specular_params[0] = intensity;
  482. }
  483. /**
  484. * Get the specular color intensity for the object non-node material.
  485. * @method module:material.get_specular_intensity
  486. * @param {Object3D} obj Object 3D
  487. * @param {string} mat_name Material name
  488. * @returns {number} Specular color intensity
  489. * @example var m_scenes = require("scenes");
  490. * var m_mat = require("material");
  491. *
  492. * var cube = m_scenes.get_object_by_name("Cube");
  493. * var specular_intensity = m_mat.get_specular_intensity(cube, "MyMaterial");
  494. */
  495. exports.get_specular_intensity = function(obj, mat_name) {
  496. if (!m_obj_util.is_dynamic_mesh(obj)) {
  497. m_print.error("get_specular_intensity(): Object \"" + obj.name
  498. + "\" is not a dynamic MESH.");
  499. return 0;
  500. }
  501. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  502. if (!batch) {
  503. m_print.error("get_specular_intensity(): Material \"" + mat_name
  504. + "\" wasn't found on the object \"" + obj.name + "\".");
  505. return 0;
  506. }
  507. if (batch.has_nodes) {
  508. m_print.error("get_specular_intensity(): Not allowed for node materials! "
  509. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  510. return 0;
  511. }
  512. return batch.specular_params[0];
  513. }
  514. /**
  515. * Check the specular intensity for the object material.
  516. * @method module:material.check_specular_intensity
  517. * @param {Object3D} obj Object 3D
  518. * @param {string} mat_name Material name
  519. * @returns {boolean} Specular intensity presence
  520. * @deprecated [17.06] not needed anymore.
  521. * @example var m_scenes = require("scenes");
  522. * var m_mat = require("material");
  523. *
  524. * var cube = m_scenes.get_object_by_name("Cube");
  525. * var has_specular_intensity = m_mat.check_specular_intensity(cube, "MyMaterial");
  526. */
  527. exports.check_specular_intensity = function(obj, mat_name) {
  528. m_print.error_once("check_specular_intensity() is deprecated, not needed anymore");
  529. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  530. return Boolean(batch && batch.specular_params[0]);
  531. }
  532. /**
  533. * Set the specular color hardness for the object non-node material.
  534. * @method module:material.set_specular_hardness
  535. * @param {Object3D} obj Object 3D
  536. * @param {string} mat_name Material name
  537. * @param {number} hardness Specular hardness value
  538. * @example
  539. * var m_mat = require("material");
  540. * var m_scenes = require("scenes");
  541. *
  542. * var cube = m_scenes.get_object_by_name("Cube");
  543. * m_mat.set_specular_hardness(cube, "MyMaterial", 0.8);
  544. */
  545. exports.set_specular_hardness = function(obj, mat_name, hardness) {
  546. if (!m_obj_util.is_dynamic_mesh(obj)) {
  547. m_print.error("set_specular_hardness(): Object \"" + obj.name
  548. + "\" is not a dynamic MESH.");
  549. return;
  550. }
  551. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  552. if (!batch) {
  553. m_print.error("set_specular_hardness(): Material \"" + mat_name
  554. + "\" wasn't found on the object \"" + obj.name + "\".");
  555. return;
  556. }
  557. if (batch.has_nodes) {
  558. m_print.error("set_specular_hardness(): Not allowed for node materials! "
  559. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  560. return;
  561. }
  562. batch.specular_params[1] = hardness;
  563. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  564. if (reflect_batch)
  565. reflect_batch.specular_params[1] = hardness;
  566. }
  567. /**
  568. * Get the specular color hardness for the object non-node material.
  569. * @method module:material.get_specular_hardness
  570. * @param {Object3D} obj Object 3D
  571. * @param {string} mat_name Material name
  572. * @returns {number} Specular color hardness
  573. * @example var m_scenes = require("scenes");
  574. * var m_mat = require("material");
  575. *
  576. * var cube = m_scenes.get_object_by_name("Cube");
  577. * var specular_hardness = m_mat.get_specular_hardness(cube, "MyMaterial");
  578. */
  579. exports.get_specular_hardness = function(obj, mat_name) {
  580. if (!m_obj_util.is_dynamic_mesh(obj)) {
  581. m_print.error("get_specular_hardness(): Object \"" + obj.name
  582. + "\" is not a dynamic MESH.");
  583. return 0;
  584. }
  585. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  586. if (!batch) {
  587. m_print.error("get_specular_hardness(): Material \"" + mat_name
  588. + "\" wasn't found on the object \"" + obj.name + "\".");
  589. return 0;
  590. }
  591. if (batch.has_nodes) {
  592. m_print.error("get_specular_hardness(): Not allowed for node materials! "
  593. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  594. return 0;
  595. }
  596. return batch.specular_params[1];
  597. }
  598. /**
  599. * Check the specular hardness for the object material.
  600. * @method module:material.check_specular_hardness
  601. * @param {Object3D} obj Object 3D
  602. * @param {string} mat_name Material name
  603. * @returns {boolean} Specular hardness presence
  604. * @deprecated [17.06] not needed anymore.
  605. * @example var m_scenes = require("scenes");
  606. * var m_mat = require("material");
  607. *
  608. * var cube = m_scenes.get_object_by_name("Cube");
  609. * var has_specular_hardness = m_mat.check_specular_hardness(cube, "MyMaterial");
  610. */
  611. exports.check_specular_hardness = function(obj, mat_name) {
  612. m_print.error_once("check_specular_hardness() is deprecated, not needed anymore");
  613. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  614. return Boolean(batch && batch.specular_params[1]);
  615. }
  616. /**
  617. * Set the emit factor for the object non-node material.
  618. * @method module:material.set_emit_factor
  619. * @param {Object3D} obj Object 3D
  620. * @param {string} mat_name Material name
  621. * @param {number} emit_factor Emit factor value
  622. * @example
  623. * var m_mat = require("material");
  624. * var m_scenes = require("scenes");
  625. *
  626. * var cube = m_scenes.get_object_by_name("Cube");
  627. * m_mat.set_emit_factor(cube, "MyMaterial", 1);
  628. */
  629. exports.set_emit_factor = function(obj, mat_name, emit_factor) {
  630. if (!m_obj_util.is_dynamic_mesh(obj)) {
  631. m_print.error("set_emit_factor(): Object \"" + obj.name
  632. + "\" is not a dynamic MESH.");
  633. return;
  634. }
  635. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  636. if (!batch) {
  637. m_print.error("set_emit_factor(): Material \"" + mat_name
  638. + "\" wasn't found on the object \"" + obj.name + "\".");
  639. return;
  640. }
  641. if (batch.has_nodes) {
  642. m_print.error("set_emit_factor(): Not allowed for node materials! "
  643. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  644. return;
  645. }
  646. batch.emit = emit_factor;
  647. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  648. if (reflect_batch)
  649. reflect_batch.emit = emit_factor;
  650. }
  651. /**
  652. * Get the emit factor for the object non-node material.
  653. * @method module:material.get_emit_factor
  654. * @param {Object3D} obj Object 3D
  655. * @param {string} mat_name Material name
  656. * @returns {number} Emit factor value
  657. * @example var m_scenes = require("scenes");
  658. * var m_mat = require("material");
  659. *
  660. * var cube = m_scenes.get_object_by_name("Cube");
  661. * var emit_factor = m_mat.get_emit_factor(cube, "MyMaterial");
  662. */
  663. exports.get_emit_factor = function(obj, mat_name) {
  664. if (!m_obj_util.is_dynamic_mesh(obj)) {
  665. m_print.error("get_emit_factor(): Object \"" + obj.name
  666. + "\" is not a dynamic MESH.");
  667. return 0;
  668. }
  669. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  670. if (!batch) {
  671. m_print.error("get_emit_factor(): Material \"" + mat_name
  672. + "\" wasn't found on the object \"" + obj.name + "\".");
  673. return 0;
  674. }
  675. if (batch.has_nodes) {
  676. m_print.error("get_emit_factor(): Not allowed for node materials! "
  677. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  678. return 0;
  679. }
  680. return batch.emit;
  681. }
  682. /**
  683. * Set the ambient factor for the object non-node material.
  684. * @method module:material.set_ambient_factor
  685. * @param {Object3D} obj Object 3D
  686. * @param {string} mat_name Material name
  687. * @param {number} ambient_factor Ambient factor value
  688. * @example var m_scenes = require("scenes");
  689. * var m_mat = require("material");
  690. *
  691. * var cube = m_scenes.get_object_by_name("Cube");
  692. * m_mat.set_ambient_factor(cube, "MyMaterial", 0.6);
  693. */
  694. exports.set_ambient_factor = function(obj, mat_name, ambient_factor) {
  695. if (!m_obj_util.is_dynamic_mesh(obj)) {
  696. m_print.error("set_ambient_factor(): Object \"" + obj.name
  697. + "\" is not a dynamic MESH.");
  698. return;
  699. }
  700. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  701. if (!batch) {
  702. m_print.error("set_ambient_factor(): Material \"" + mat_name
  703. + "\" wasn't found on the object \"" + obj.name + "\".");
  704. return;
  705. }
  706. if (batch.has_nodes) {
  707. m_print.error("set_ambient_factor(): Not allowed for node materials! "
  708. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  709. return;
  710. }
  711. batch.ambient = ambient_factor;
  712. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  713. if (reflect_batch)
  714. reflect_batch.ambient = ambient_factor;
  715. }
  716. /**
  717. * Get the ambient factor for the object non-node material.
  718. * @method module:material.get_ambient_factor
  719. * @param {Object3D} obj Object 3D
  720. * @param {string} mat_name Material name
  721. * @returns {number} Ambient factor value
  722. * @example var m_scenes = require("scenes");
  723. * var m_mat = require("material");
  724. *
  725. * var cube = m_scenes.get_object_by_name("Cube");
  726. * var ambient_factor = m_mat.get_ambient_factor(cube, "MyMaterial");
  727. */
  728. exports.get_ambient_factor = function(obj, mat_name) {
  729. if (!m_obj_util.is_dynamic_mesh(obj)) {
  730. m_print.error("get_ambient_factor(): Object \"" + obj.name
  731. + "\" is not a dynamic MESH.");
  732. return 0;
  733. }
  734. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  735. if (!batch) {
  736. m_print.error("get_ambient_factor(): Material \"" + mat_name
  737. + "\" wasn't found on the object \"" + obj.name + "\".");
  738. return 0;
  739. }
  740. if (batch.has_nodes) {
  741. m_print.error("get_ambient_factor(): Not allowed for node materials! "
  742. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  743. return 0;
  744. }
  745. return batch.ambient;
  746. }
  747. /**
  748. * Set the diffuse color factor for the object non-node material.
  749. * @method module:material.set_diffuse_color_factor
  750. * @param {Object3D} obj Object 3D
  751. * @param {string} mat_name Material name
  752. * @param {number} diffuse_color_factor Diffuse color factor value
  753. * @example var m_scenes = require("scenes");
  754. * var m_mat = require("material");
  755. *
  756. * var cube = m_scenes.get_object_by_name("Cube");
  757. * m_mat.set_diffuse_color_factor(cube, "MyMaterial", 0.05);
  758. */
  759. exports.set_diffuse_color_factor = function(obj, mat_name, diffuse_color_factor) {
  760. if (!m_obj_util.is_dynamic_mesh(obj)) {
  761. m_print.error("set_diffuse_color_factor(): Object \"" + obj.name
  762. + "\" is not a dynamic MESH.");
  763. return;
  764. }
  765. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  766. if (!batch) {
  767. m_print.error("set_diffuse_color_factor(): Material \"" + mat_name
  768. + "\" wasn't found on the object \"" + obj.name + "\".");
  769. return;
  770. }
  771. if (batch.has_nodes) {
  772. m_print.error("set_diffuse_color_factor(): Not allowed for node materials! "
  773. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  774. return;
  775. }
  776. batch.diffuse_color_factor = diffuse_color_factor;
  777. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  778. if (reflect_batch)
  779. reflect_batch.diffuse_color_factor = diffuse_color_factor;
  780. }
  781. /**
  782. * Get the diffuse color factor for the object non-node material.
  783. * @method module:material.get_diffuse_color_factor
  784. * @param {Object3D} obj Object 3D
  785. * @param {string} mat_name Material name
  786. * @returns {number} Diffuse color factor value
  787. * @example var m_scenes = require("scenes");
  788. * var m_mat = require("material");
  789. *
  790. * var cube = m_scenes.get_object_by_name("Cube");
  791. * var diffuse_color_factor = m_mat.get_diffuse_color_factor(cube, "MyMaterial");
  792. */
  793. exports.get_diffuse_color_factor = function(obj, mat_name) {
  794. if (!m_obj_util.is_dynamic_mesh(obj)) {
  795. m_print.error("get_diffuse_color_factor(): Object \"" + obj.name
  796. + "\" is not a dynamic MESH.");
  797. return 0;
  798. }
  799. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  800. if (!batch) {
  801. m_print.error("get_diffuse_color_factor(): Material \"" + mat_name
  802. + "\" wasn't found on the object \"" + obj.name + "\".");
  803. return 0;
  804. }
  805. if (batch.has_nodes) {
  806. m_print.error("get_diffuse_color_factor(): Not allowed for node materials! "
  807. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  808. return 0;
  809. }
  810. return batch.diffuse_color_factor;
  811. }
  812. /**
  813. * Set the alpha factor for the object non-node material.
  814. * @method module:material.set_alpha_factor
  815. * @param {Object3D} obj Object 3D
  816. * @param {string} mat_name Material name
  817. * @param {number} alpha_factor Alpha factor value
  818. * @example
  819. * var m_mat = require("material");
  820. * var m_scenes = require("scenes");
  821. *
  822. * var cube = m_scenes.get_object_by_name("Cube");
  823. * m_mat.set_alpha_factor(cube, "MyMaterial", 0.2);
  824. */
  825. exports.set_alpha_factor = function(obj, mat_name, alpha_factor) {
  826. if (!m_obj_util.is_dynamic_mesh(obj)) {
  827. m_print.error("set_alpha_factor(): Object \"" + obj.name
  828. + "\" is not a dynamic MESH.");
  829. return;
  830. }
  831. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  832. if (!batch) {
  833. m_print.error("set_alpha_factor(): Material \"" + mat_name
  834. + "\" wasn't found on the object \"" + obj.name + "\".");
  835. return;
  836. }
  837. if (batch.has_nodes) {
  838. m_print.error("set_alpha_factor(): Not allowed for node materials! "
  839. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  840. return;
  841. }
  842. batch.alpha_factor = alpha_factor;
  843. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  844. if (reflect_batch)
  845. reflect_batch.alpha_factor = alpha_factor;
  846. }
  847. /**
  848. * Get the diffuse alpha factor for the object non-node material.
  849. * @method module:material.get_alpha_factor
  850. * @param {Object3D} obj Object 3D
  851. * @param {string} mat_name Material name
  852. * @returns {number} Diffuse alpha factor value
  853. * @example var m_scenes = require("scenes");
  854. * var m_mat = require("material");
  855. *
  856. * var cube = m_scenes.get_object_by_name("Cube");
  857. * var alpha_factor = m_mat.get_alpha_factor(cube, "MyMaterial");
  858. */
  859. exports.get_alpha_factor = function(obj, mat_name) {
  860. if (!m_obj_util.is_dynamic_mesh(obj)) {
  861. m_print.error("get_alpha_factor(): Object \"" + obj.name
  862. + "\" is not a dynamic MESH.");
  863. return 0;
  864. }
  865. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  866. if (!batch) {
  867. m_print.error("get_alpha_factor(): Material \"" + mat_name
  868. + "\" wasn't found on the object \"" + obj.name + "\".");
  869. return 0;
  870. }
  871. if (batch.has_nodes) {
  872. m_print.error("get_alpha_factor(): Not allowed for node materials! "
  873. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  874. return 0;
  875. }
  876. return batch.alpha_factor;
  877. }
  878. /**
  879. * Get the material extended params for the object non-node material.
  880. * @method module:material.get_material_extended_params
  881. * @param {Object3D} obj Object 3D
  882. * @param {string} mat_name Material name
  883. * @returns {?MaterialExtParams} Material extended params or null
  884. * @example var m_scenes = require("scenes");
  885. * var m_mat = require("material");
  886. *
  887. * var cube = m_scenes.get_object_by_name("Cube");
  888. * var extended_parameters = m_mat.get_material_extended_params(cube, "MyMaterial");
  889. */
  890. exports.get_material_extended_params = function(obj, mat_name) {
  891. if (!m_obj_util.is_dynamic_mesh(obj)) {
  892. m_print.error("get_material_extended_params(): Object \"" + obj.name
  893. + "\" is not a dynamic MESH.");
  894. return null;
  895. }
  896. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  897. if (!batch) {
  898. m_print.error("get_material_extended_params(): Material \"" + mat_name
  899. + "\" wasn't found on the object \"" + obj.name + "\".");
  900. return null;
  901. }
  902. if (batch.has_nodes) {
  903. m_print.error("get_material_extended_params(): Not allowed for node materials! "
  904. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  905. return null;
  906. }
  907. var mat_params = {};
  908. mat_params.reflect_factor = batch.reflect_factor;
  909. mat_params.fresnel = batch.fresnel_params[0];
  910. mat_params.fresnel_factor = 5 * (1 - batch.fresnel_params[1]);
  911. mat_params.parallax_scale = batch.parallax_scale;
  912. mat_params.parallax_steps = parseFloat(m_batch.get_batch_directive(batch,
  913. "PARALLAX_STEPS")[1]);
  914. return mat_params;
  915. }
  916. /**
  917. * Set the material extended params for the object non-node material.
  918. * @method module:material.set_material_extended_params
  919. * @param {Object3D} obj Object 3D
  920. * @param {string} mat_name Material name
  921. * @param {MaterialExtParams} mat_params Material params
  922. * @example var m_scenes = require("scenes");
  923. * var m_mat = require("material");
  924. *
  925. * var cube = m_scenes.get_object_by_name("Cube");
  926. * m_mat.set_material_extended_params(cube, "MyMaterial", {
  927. * fresnel: 0,
  928. * fresnel_factor: 1.25,
  929. * parallax_scale: 0,
  930. * parallax_steps: 5,
  931. * reflect_factor: 0
  932. * });
  933. */
  934. exports.set_material_extended_params = function(obj, mat_name, mat_params) {
  935. if (!m_obj_util.is_dynamic_mesh(obj)) {
  936. m_print.error("set_material_extended_params(): Object \"" + obj.name
  937. + "\" is not a dynamic MESH.");
  938. return;
  939. }
  940. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  941. if (!batch) {
  942. m_print.error("set_material_extended_params(): Material \"" + mat_name
  943. + "\" wasn't found on the object \"" + obj.name + "\".");
  944. return;
  945. }
  946. if (batch.has_nodes) {
  947. m_print.error("set_material_extended_params(): Not allowed for node materials! "
  948. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  949. return;
  950. }
  951. var batches = [batch];
  952. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  953. if (reflect_batch)
  954. batches.push(reflect_batch);
  955. for (var i = 0; i < batches.length; i++) {
  956. batch = batches[i];
  957. if (typeof mat_params.reflect_factor == "number")
  958. batch.reflect_factor = mat_params.reflect_factor;
  959. if (typeof mat_params.fresnel == "number")
  960. batch.fresnel_params[0] = mat_params.fresnel;
  961. if (typeof mat_params.fresnel_factor == "number")
  962. batch.fresnel_params[1] = 1 - mat_params.fresnel_factor / 5;
  963. if (typeof mat_params.parallax_scale == "number")
  964. batch.parallax_scale = mat_params.parallax_scale;
  965. if (typeof mat_params.parallax_steps == "number") {
  966. m_batch.set_batch_directive(batch, "PARALLAX_STEPS",
  967. m_shaders.glsl_value(mat_params.parallax_steps));
  968. m_batch.update_shader(batch);
  969. m_scenes.recalculate_draw_data(batch);
  970. }
  971. }
  972. }
  973. /**
  974. * Get the parameters of a water non-node material.
  975. * @method module:material.get_water_material_params
  976. * @param {Object3D} obj Object 3D
  977. * @param {string} mat_name Water material name
  978. * @returns {?WaterMaterialParams} Water material params or null.
  979. * @example var m_scenes = require("scenes");
  980. * var m_mat = require("material");
  981. *
  982. * var water = m_scenes.get_object_by_name("MyWater");
  983. * var water_params = m_mat.get_water_material_params(water, "MyMaterial");
  984. */
  985. exports.get_water_material_params = function(obj, mat_name) {
  986. if (!m_obj_util.is_dynamic_mesh(obj)) {
  987. m_print.error("get_water_material_params(): Object \"" + obj.name
  988. + "\" is not a dynamic MESH.");
  989. return null;
  990. }
  991. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  992. if (!batch || !batch.water) {
  993. m_print.error("get_water_material_params(): Material \"" + mat_name
  994. + "\" wasn't found on the object \"" + obj.name
  995. + "\" or it's not a water material.");
  996. return null;
  997. }
  998. if (batch.has_nodes) {
  999. m_print.error("get_water_material_params(): Not allowed for node materials! "
  1000. + "Use get_nodemat_value/get_nodemat_rgb methods instead.");
  1001. return null;
  1002. }
  1003. var water_mat_params = {};
  1004. water_mat_params.shore_smoothing = cfg_def.shore_smoothing
  1005. && batch.water_shore_smoothing && Boolean(parseFloat(
  1006. m_batch.get_batch_directive(batch, "SHORE_SMOOTHING")[1]));
  1007. water_mat_params.absorb_factor = parseFloat(m_batch.get_batch_directive(
  1008. batch, "ABSORB")[1]);
  1009. water_mat_params.foam_factor = batch.foam_factor;
  1010. water_mat_params.shallow_water_col = new Float32Array(3);
  1011. water_mat_params.shore_water_col = new Float32Array(3);
  1012. water_mat_params.shallow_water_col_fac = 0;
  1013. water_mat_params.shore_water_col_fac = 0;
  1014. if (cfg_def.shore_distance) {
  1015. water_mat_params.shallow_water_col.set(batch.shallow_water_col);
  1016. water_mat_params.shore_water_col.set(batch.shore_water_col);
  1017. water_mat_params.shallow_water_col_fac = batch.shallow_water_col_fac;
  1018. water_mat_params.shore_water_col_fac = batch.shore_water_col_fac;
  1019. }
  1020. water_mat_params.norm_uv_velocity = batch.water_norm_uv_velocity;
  1021. water_mat_params.water_dynamic = cfg_def.water_dynamic
  1022. && batch.water_dynamic && Boolean(parseFloat(
  1023. m_batch.get_batch_directive(batch, "DYNAMIC")[1]));
  1024. water_mat_params.sss_strength = parseFloat(m_batch.get_batch_directive(
  1025. batch, "SSS_STRENGTH")[1]);
  1026. water_mat_params.sss_width = parseFloat(m_batch.get_batch_directive(
  1027. batch, "SSS_WIDTH")[1]);
  1028. water_mat_params.waves_height = parseFloat(m_batch.get_batch_directive(
  1029. batch, "WAVES_HEIGHT")[1]);
  1030. water_mat_params.waves_length = parseFloat(m_batch.get_batch_directive(
  1031. batch, "WAVES_LENGTH")[1]);
  1032. water_mat_params.dst_noise_scale0 = parseFloat(m_batch.get_batch_directive(
  1033. batch, "DST_NOISE_SCALE_0")[1]);
  1034. water_mat_params.dst_noise_scale1 = parseFloat(m_batch.get_batch_directive(
  1035. batch, "DST_NOISE_SCALE_1")[1]);
  1036. water_mat_params.dst_noise_freq0 = parseFloat(m_batch.get_batch_directive(
  1037. batch, "DST_NOISE_FREQ_0")[1]);
  1038. water_mat_params.dst_noise_freq1 = parseFloat(m_batch.get_batch_directive(
  1039. batch, "DST_NOISE_FREQ_1")[1]);
  1040. water_mat_params.dir_min_shore_fac = parseFloat(m_batch.get_batch_directive(
  1041. batch, "DIR_MIN_SHR_FAC")[1]);
  1042. water_mat_params.dir_freq = parseFloat(m_batch.get_batch_directive(batch,
  1043. "DIR_FREQ")[1]);
  1044. water_mat_params.dir_noise_scale = parseFloat(m_batch.get_batch_directive(
  1045. batch, "DIR_NOISE_SCALE")[1]);
  1046. water_mat_params.dir_noise_freq = parseFloat(m_batch.get_batch_directive(
  1047. batch, "DIR_NOISE_FREQ")[1]);
  1048. water_mat_params.dir_min_noise_fac = parseFloat(m_batch.get_batch_directive(
  1049. batch, "DIR_MIN_NOISE_FAC")[1]);
  1050. water_mat_params.dst_min_fac = parseFloat(m_batch.get_batch_directive(batch,
  1051. "DST_MIN_FAC")[1]);
  1052. water_mat_params.waves_hor_fac = parseFloat(m_batch.get_batch_directive(
  1053. batch, "WAVES_HOR_FAC")[1]);
  1054. return water_mat_params;
  1055. }
  1056. /**
  1057. * Set parameters for a water non-node material.
  1058. * @method module:material.set_water_material_params
  1059. * @param {Object3D} obj Object 3D
  1060. * @param {string} mat_name Water material name
  1061. * @param {WaterMaterialParams} water_mat_params Water material parameters.
  1062. * @example var m_scenes = require("scenes");
  1063. * var m_mat = require("material");
  1064. *
  1065. * var water = m_scenes.get_object_by_name("MyWater");
  1066. * var water_params = m_mat.set_water_material_params(water, "MyMaterial", {
  1067. * waves_height: 2,
  1068. * waves_length: 20,
  1069. * shallow_water_col: [0, 0.3, 0.8]
  1070. * });
  1071. */
  1072. exports.set_water_material_params = function(obj, mat_name, water_mat_params) {
  1073. if (!m_obj_util.is_dynamic_mesh(obj)) {
  1074. m_print.error("set_water_material_params(): Object \"" + obj.name
  1075. + "\" is not a dynamic MESH.");
  1076. return;
  1077. }
  1078. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  1079. if (!batch || !batch.water) {
  1080. m_print.error("set_water_material_params(): Material \"" + mat_name
  1081. + "\" wasn't found on the object \"" + obj.name
  1082. + "\" or it's not a water material.");
  1083. return;
  1084. }
  1085. if (batch.has_nodes) {
  1086. m_print.error("set_water_material_params(): Not allowed for node materials! "
  1087. + "Use set_nodemat_value/set_nodemat_rgb methods instead.");
  1088. return;
  1089. }
  1090. var batches = [batch];
  1091. var reflect_batch = m_batch.find_batch_material_forked(obj, mat_name, "MAIN");
  1092. if (reflect_batch)
  1093. batches.push(reflect_batch);
  1094. for (var i = 0; i < batches.length; i++) {
  1095. batch = batches[i];
  1096. if (typeof water_mat_params.shore_smoothing == "boolean")
  1097. if (cfg_def.shore_smoothing && batch.water_shore_smoothing
  1098. && water_mat_params.shore_smoothing)
  1099. m_batch.set_batch_directive(batch, "SHORE_SMOOTHING", 1);
  1100. else
  1101. m_batch.set_batch_directive(batch, "SHORE_SMOOTHING", 0);
  1102. if (typeof water_mat_params.absorb_factor == "number") {
  1103. var absorb_factor = m_shaders.glsl_value(parseFloat(
  1104. water_mat_params.absorb_factor));
  1105. m_batch.set_batch_directive(batch, "ABSORB", absorb_factor);
  1106. }
  1107. if (typeof water_mat_params.foam_factor == "number" && cfg_def.foam)
  1108. batch.foam_factor = water_mat_params.foam_factor;
  1109. if (cfg_def.shore_distance) {
  1110. if (typeof water_mat_params.shallow_water_col == "object")
  1111. batch.shallow_water_col.set(water_mat_params.shallow_water_col);
  1112. if (typeof water_mat_params.shallow_water_col_fac == "number")
  1113. batch.shallow_water_col_fac = water_mat_params.shallow_water_col_fac;
  1114. if (typeof water_mat_params.shore_water_col == "object")
  1115. batch.shore_water_col.set(water_mat_params.shore_water_col);
  1116. if (typeof water_mat_params.shore_water_col_fac == "number")
  1117. batch.shore_water_col_fac = water_mat_params.shore_water_col_fac;
  1118. }
  1119. if (typeof water_mat_params.norm_uv_velocity == "number")
  1120. batch.water_norm_uv_velocity = water_mat_params.norm_uv_velocity;
  1121. if (cfg_def.water_dynamic && batch.water_dynamic) {
  1122. if (typeof water_mat_params.water_dynamic == "boolean") {
  1123. if (water_mat_params.water_dynamic)
  1124. m_batch.set_batch_directive(batch, "DYNAMIC", 1);
  1125. else
  1126. m_batch.set_batch_directive(batch, "DYNAMIC", 0);
  1127. }
  1128. if (typeof water_mat_params.sss_strength == "number") {
  1129. var waves_length = m_shaders.glsl_value(parseFloat(
  1130. water_mat_params.sss_strength));
  1131. m_batch.set_batch_directive(batch, "SSS_STRENGTH", waves_length);
  1132. }
  1133. if (typeof water_mat_params.sss_width == "number") {
  1134. var waves_length = m_shaders.glsl_value(parseFloat(
  1135. water_mat_params.sss_width));
  1136. m_batch.set_batch_directive(batch, "SSS_WIDTH", waves_length);
  1137. }
  1138. if (typeof water_mat_params.waves_height == "number") {
  1139. var waves_height = m_shaders.glsl_value(parseFloat(
  1140. water_mat_params.waves_height));
  1141. m_batch.set_batch_directive(batch, "WAVES_HEIGHT", waves_height);
  1142. }
  1143. if (typeof water_mat_params.waves_length == "number") {
  1144. var waves_length = m_shaders.glsl_value(parseFloat(
  1145. water_mat_params.waves_length));
  1146. m_batch.set_batch_directive(batch, "WAVES_LENGTH", waves_length);
  1147. }
  1148. if (typeof water_mat_params.dst_noise_scale0 == "number") {
  1149. var dst_noise_scale0 = m_shaders.glsl_value(parseFloat(
  1150. water_mat_params.dst_noise_scale0));
  1151. m_batch.set_batch_directive(batch, "DST_NOISE_SCALE_0", dst_noise_scale0);
  1152. }
  1153. if (typeof water_mat_params.dst_noise_scale1 == "number") {
  1154. var dst_noise_scale1 = m_shaders.glsl_value(parseFloat(
  1155. water_mat_params.dst_noise_scale1));
  1156. m_batch.set_batch_directive(batch, "DST_NOISE_SCALE_1", dst_noise_scale1);
  1157. }
  1158. if (typeof water_mat_params.dst_noise_freq0 == "number") {
  1159. var dst_noise_freq0 = m_shaders.glsl_value(parseFloat(
  1160. water_mat_params.dst_noise_freq0));
  1161. m_batch.set_batch_directive(batch, "DST_NOISE_FREQ_0", dst_noise_freq0);
  1162. }
  1163. if (typeof water_mat_params.dst_noise_freq1 == "number") {
  1164. var dst_noise_freq1 = m_shaders.glsl_value(parseFloat(
  1165. water_mat_params.dst_noise_freq1));
  1166. m_batch.set_batch_directive(batch, "DST_NOISE_FREQ_1", dst_noise_freq1);
  1167. }
  1168. if (typeof water_mat_params.dir_min_shore_fac == "number") {
  1169. var dir_min_shore_fac = m_shaders.glsl_value(parseFloat(
  1170. water_mat_params.dir_min_shore_fac));
  1171. m_batch.set_batch_directive(batch, "DIR_MIN_SHR_FAC", dir_min_shore_fac);
  1172. }
  1173. if (typeof water_mat_params.dir_freq == "number") {
  1174. var dir_freq = m_shaders.glsl_value(parseFloat(
  1175. water_mat_params.dir_freq));
  1176. m_batch.set_batch_directive(batch, "DIR_FREQ", dir_freq);
  1177. }
  1178. if (typeof water_mat_params.dir_noise_scale == "number") {
  1179. var dir_noise_scale = m_shaders.glsl_value(parseFloat(
  1180. water_mat_params.dir_noise_scale));
  1181. m_batch.set_batch_directive(batch, "DIR_NOISE_SCALE", dir_noise_scale);
  1182. }
  1183. if (typeof water_mat_params.dir_noise_freq == "number") {
  1184. var dir_noise_freq = m_shaders.glsl_value(parseFloat(
  1185. water_mat_params.dir_noise_freq));
  1186. m_batch.set_batch_directive(batch, "DIR_NOISE_FREQ", dir_noise_freq);
  1187. }
  1188. if (typeof water_mat_params.dir_min_noise_fac == "number") {
  1189. var dir_min_noise_fac = m_shaders.glsl_value(parseFloat(
  1190. water_mat_params.dir_min_noise_fac));
  1191. m_batch.set_batch_directive(batch, "DIR_MIN_NOISE_FAC", dir_min_noise_fac);
  1192. }
  1193. if (typeof water_mat_params.dst_min_fac == "number") {
  1194. var dst_min_fac = m_shaders.glsl_value(parseFloat(
  1195. water_mat_params.dst_min_fac));
  1196. m_batch.set_batch_directive(batch, "DST_MIN_FAC", dst_min_fac);
  1197. }
  1198. if (typeof water_mat_params.waves_hor_fac == "number") {
  1199. var waves_hor_fac = m_shaders.glsl_value(parseFloat(
  1200. water_mat_params.waves_hor_fac));
  1201. m_batch.set_batch_directive(batch, "WAVES_HOR_FAC", waves_hor_fac);
  1202. }
  1203. }
  1204. m_batch.update_shader(batch);
  1205. m_scenes.recalculate_draw_data(batch);
  1206. }
  1207. }
  1208. /**
  1209. * Set parameters for a LINE object.
  1210. * @method module:material.set_line_params
  1211. * @param {Object3D} obj Line object 3D
  1212. * @param {LineParams} line_params Line parameters
  1213. * @example
  1214. * var m_mat = require("material");
  1215. * var m_scenes = require("scenes");
  1216. *
  1217. * var empty = m_scenes.get_object_by_name("Empty");
  1218. * m_mat.set_line_params(empty, {
  1219. * color: [1.0, 0.0, 0.0, 1.0],
  1220. * width: 5
  1221. * });
  1222. */
  1223. exports.set_line_params = function(obj, line_params) {
  1224. if (!m_obj_util.is_line(obj)) {
  1225. m_print.error("set_line_params(): Object \"" + obj.name
  1226. + "\" is not a LINE object.");
  1227. return;
  1228. }
  1229. var batch = m_batch.get_first_batch(obj);
  1230. if (!batch) {
  1231. m_print.error("set_line_params(): Couldn't set line parameters!");
  1232. return;
  1233. }
  1234. if (m_util.isdef(line_params.color))
  1235. batch.diffuse_color.set(line_params.color);
  1236. if (m_util.isdef(line_params.width))
  1237. batch.line_width = line_params.width;
  1238. }
  1239. /**
  1240. * Get the parameters of a LINE object.
  1241. * @method module:material.get_line_params
  1242. * @param {Object3D} obj Line object 3D
  1243. * @returns {?LineParams} Line parameters
  1244. * @example var m_scenes = require("scenes");
  1245. * var m_mat = require("material");
  1246. *
  1247. * var line_object = m_scenes.get_object_by_name("MyLine");
  1248. * var line_params = m_mat.get_line_params(line_object);
  1249. */
  1250. exports.get_line_params = function(obj) {
  1251. if (!m_obj_util.is_line(obj)) {
  1252. m_print.error("get_line_params(): Object \"" + obj.name
  1253. + "\" is not a LINE object.");
  1254. return null;
  1255. }
  1256. var batch = m_batch.get_first_batch(obj);
  1257. if (!batch) {
  1258. m_print.error("get_line_params(): Couldn't get line parameters!");
  1259. return null;
  1260. }
  1261. var line_params = {
  1262. color : new Float32Array(batch.diffuse_color),
  1263. width: batch.line_width
  1264. }
  1265. return line_params;
  1266. }
  1267. /**
  1268. * Set value of the Value node in the object's material.
  1269. * @method module:material.set_nodemat_value
  1270. * @param {Object3D} obj Object 3D
  1271. * @param {string[]} name_list List consisting of the material name, the names of
  1272. * nested node groups (if any) and the name of the Value node itself. Should
  1273. * have at least 2 elements ["Mat","Node"]. For a world node material the
  1274. * material name should be omitted.
  1275. * @param {number} value The value to set the Value node to
  1276. * @example
  1277. * var m_mat = require("material");
  1278. * var m_scenes = require("scenes");
  1279. *
  1280. * var cube = m_scenes.get_object_by_name("Cube");
  1281. * m_mat.set_nodemat_value(cube, ["MyMaterial", "Value.001"], 20);
  1282. */
  1283. exports.set_nodemat_value = function(obj, name_list, value) {
  1284. var is_dyn_mesh = m_obj_util.is_dynamic_mesh(obj);
  1285. var is_world = m_obj_util.is_world(obj);
  1286. var obj_name = is_world ? m_obj.get_world_name(obj) : obj.name;
  1287. if (!is_dyn_mesh && !is_world) {
  1288. m_print.error("set_nodemat_value(): Object \"" + obj_name
  1289. + "\" is not a dynamic MESH or WORLD.");
  1290. return;
  1291. }
  1292. if (is_dyn_mesh) {
  1293. var mat_name = name_list[0];
  1294. var node_name_prefix_offset = 1;
  1295. var mat_batch = m_batch.find_batch_material_any(obj, mat_name, "MAIN")
  1296. || m_batch.find_batch_material_any(obj, mat_name, "PARTICLES");
  1297. if (!mat_batch) {
  1298. m_print.error("set_nodemat_value(): Material \"" + mat_name
  1299. + "\" wasn't found on the object \"" + obj_name + "\".");
  1300. return;
  1301. }
  1302. } else if (is_world) {
  1303. var active_scene = m_scenes.get_active();
  1304. var mat_name = "";
  1305. var node_name_prefix_offset = 0;
  1306. var mat_batch = m_batch.get_batch_by_type(obj, "SKY", active_scene);
  1307. if (!mat_batch) {
  1308. m_print.error("set_nodemat_value(): Sky node material wasn't found on the world object \""
  1309. + obj_name + "\".");
  1310. return;
  1311. }
  1312. }
  1313. var node_name = m_batch.name_list_to_node_name(name_list, node_name_prefix_offset);
  1314. var is_changed = m_obj.set_nodemat_value(obj, mat_name, node_name, value);
  1315. if (!is_changed) {
  1316. m_print.error("set_nodemat_value(): Value node \""
  1317. + name_list[name_list.length - 1]
  1318. + "\" was not found in the object \"" + obj_name + "\".");
  1319. }
  1320. }
  1321. /**
  1322. * Get value of the Value node in the object's material.
  1323. * @method module:material.get_nodemat_value
  1324. * @param {Object3D} obj Object 3D
  1325. * @param {string[]} name_list List consisting of the material name, the names of
  1326. * nested node groups (if any) and the name of the Value node itself. Should
  1327. * have at least 2 elements ["Mat","Node"]. For a world node material the
  1328. * material name should be omitted.
  1329. * @returns {number} Value.
  1330. * @example var m_scenes = require("scenes");
  1331. * var m_mat = require("material");
  1332. *
  1333. * var cube = m_scenes.get_object_by_name("Cube");
  1334. * var node_value = m_mat.get_nodemat_value(cube, ["MyMaterial", "MyValue"]);
  1335. */
  1336. exports.get_nodemat_value = function(obj, name_list) {
  1337. var is_dyn_mesh = m_obj_util.is_dynamic_mesh(obj);
  1338. var is_world = m_obj_util.is_world(obj);
  1339. var obj_name = is_world ? m_obj.get_world_name(obj) : obj.name;
  1340. if (!is_dyn_mesh && !is_world) {
  1341. m_print.error("get_nodemat_value(): Object \"" + obj_name
  1342. + "\" is not a dynamic MESH or WORLD.");
  1343. return 0;
  1344. }
  1345. if (is_dyn_mesh) {
  1346. var mat_name = name_list[0];
  1347. var node_name_prefix_offset = 1;
  1348. var mat_batch = m_batch.find_batch_material_any(obj, mat_name, "MAIN")
  1349. || m_batch.find_batch_material_any(obj, mat_name, "PARTICLES");
  1350. if (!mat_batch) {
  1351. m_print.error("get_nodemat_value(): Material \"" + mat_name
  1352. + "\" wasn't found on the object \"" + obj_name + "\".");
  1353. return 0;
  1354. }
  1355. } else if (is_world) {
  1356. var active_scene = m_scenes.get_active();
  1357. var mat_name = "";
  1358. var node_name_prefix_offset = 0;
  1359. var mat_batch = m_batch.get_batch_by_type(obj, "SKY", active_scene);
  1360. if (!mat_batch) {
  1361. m_print.error("get_nodemat_value(): Sky node material wasn't found on the world object \""
  1362. + obj_name + "\".");
  1363. return 0;
  1364. }
  1365. }
  1366. var node_name = m_batch.name_list_to_node_name(name_list, node_name_prefix_offset);
  1367. var value = m_obj.get_nodemat_value(obj, mat_name, node_name);
  1368. if (value === null) {
  1369. m_print.error("get_nodemat_value(): Value node \""
  1370. + name_list[name_list.length - 1]
  1371. + "\" was not found in the object \"" + obj_name + "\".");
  1372. }
  1373. return value;
  1374. }
  1375. /**
  1376. * Set color of the RGB node in the object's material.
  1377. * @method module:material.set_nodemat_rgb
  1378. * @param {Object3D} obj Object 3D
  1379. * @param {string[]} name_list List consisting of the material name, the names of
  1380. * nested node groups (if any) and the name of the RGB node itself. For a world
  1381. * node material the material name should be omitted.
  1382. * @param {number} r The value to set the red channel of the RGB node to [0..1]
  1383. * @param {number} g The value to set the green channel of the RGB node to [0..1]
  1384. * @param {number} b The value to set the blue channel of the RGB node to [0..1]
  1385. * @example
  1386. * var m_mat = require("material");
  1387. * var m_scenes = require("scenes");
  1388. *
  1389. * var cube = m_scenes.get_object_by_name("Cube");
  1390. * m_mat.set_nodemat_rgb(cube, ["MyMaterial", "RGB.001"], 1, 0, 1);
  1391. */
  1392. exports.set_nodemat_rgb = function(obj, name_list, r, g, b) {
  1393. var is_dyn_mesh = m_obj_util.is_dynamic_mesh(obj);
  1394. var is_world = m_obj_util.is_world(obj);
  1395. var obj_name = is_world ? m_obj.get_world_name(obj) : obj.name;
  1396. if (!is_dyn_mesh && !is_world) {
  1397. m_print.error("set_nodemat_rgb(): Object \"" + obj_name
  1398. + "\" is not a dynamic MESH or WORLD.");
  1399. return;
  1400. }
  1401. if (is_dyn_mesh) {
  1402. var mat_name = name_list[0];
  1403. var node_name_prefix_offset = 1;
  1404. var mat_batch = m_batch.find_batch_material_any(obj, mat_name, "MAIN")
  1405. || m_batch.find_batch_material_any(obj, mat_name, "PARTICLES");
  1406. if (!mat_batch) {
  1407. m_print.error("set_nodemat_rgb(): Material \"" + mat_name
  1408. + "\" wasn't found on the object \"" + obj_name + "\".");
  1409. return;
  1410. }
  1411. } else if (is_world) {
  1412. var active_scene = m_scenes.get_active();
  1413. var mat_name = "";
  1414. var node_name_prefix_offset = 0;
  1415. var mat_batch = m_batch.get_batch_by_type(obj, "SKY", active_scene);
  1416. if (!mat_batch) {
  1417. m_print.error("set_nodemat_rgb(): Sky node material wasn't found on the world object \""
  1418. + obj_name + "\".");
  1419. return;
  1420. }
  1421. }
  1422. var node_name = m_batch.name_list_to_node_name(name_list, node_name_prefix_offset);
  1423. var is_changed = m_obj.set_nodemat_rgb(obj, mat_name, node_name, r, g, b);
  1424. if (!is_changed) {
  1425. m_print.error("set_nodemat_rgb(): RGB node \""
  1426. + name_list[name_list.length - 1]
  1427. + "\" was not found in the object \"" + obj_name + "\".");
  1428. }
  1429. }
  1430. /**
  1431. * Get color of the RGB node in the object's material.
  1432. * @method module:material.get_nodemat_rgb
  1433. * @param {Object3D} obj Object 3D
  1434. * @param {string[]} name_list List consisting of the material name, the names of
  1435. * nested node groups (if any) and the name of the RGB node itself.
  1436. * For a world node material the material name should be omitted.
  1437. * @param {Vec3} [dest] Destination color
  1438. * @returns {?RGB} Destination color
  1439. * @example var m_scenes = require("scenes");
  1440. * var m_mat = require("material");
  1441. *
  1442. * var cube = m_scenes.get_object_by_name("Cube");
  1443. * var rgb_node_values = m_mat.get_nodemat_rgb(cube, ["MyMaterial", "MyRGB"]);
  1444. */
  1445. exports.get_nodemat_rgb = function(obj, name_list, dest) {
  1446. var is_dyn_mesh = m_obj_util.is_dynamic_mesh(obj);
  1447. var is_world = m_obj_util.is_world(obj);
  1448. var obj_name = is_world ? m_obj.get_world_name(obj) : obj.name;
  1449. if (!is_dyn_mesh && !is_world) {
  1450. m_print.error("get_nodemat_rgb(): Object \"" + obj_name
  1451. + "\" is not a dynamic MESH or WORLD.");
  1452. return null;
  1453. }
  1454. if (is_dyn_mesh) {
  1455. var mat_name = name_list[0];
  1456. var node_name_prefix_offset = 1;
  1457. var mat_batch = m_batch.find_batch_material_any(obj, mat_name, "MAIN")
  1458. || m_batch.find_batch_material_any(obj, mat_name, "PARTICLES");
  1459. if (!mat_batch) {
  1460. m_print.error("get_nodemat_rgb(): Material \"" + mat_name
  1461. + "\" wasn't found on the object \"" + obj_name + "\".");
  1462. return null;
  1463. }
  1464. } else if (is_world) {
  1465. var active_scene = m_scenes.get_active();
  1466. var mat_name = "";
  1467. var node_name_prefix_offset = 0;
  1468. var mat_batch = m_batch.get_batch_by_type(obj, "SKY", active_scene);
  1469. if (!mat_batch) {
  1470. m_print.error("get_nodemat_rgb(): Sky node material wasn't found on the world object \""
  1471. + obj_name + "\".");
  1472. return null;
  1473. }
  1474. }
  1475. if (!dest)
  1476. dest = new Float32Array(3);
  1477. var node_name = m_batch.name_list_to_node_name(name_list, node_name_prefix_offset);
  1478. dest = m_obj.get_nodemat_rgb(obj, mat_name, node_name, dest);
  1479. if (!dest) {
  1480. m_print.error("get_nodemat_rgb(): RGB node \""
  1481. + name_list[name_list.length - 1]
  1482. + "\" was not found in the object \"" + obj_name + "\".");
  1483. }
  1484. return dest;
  1485. }
  1486. /**
  1487. * Check if the object's material is a node material.
  1488. * @method module:material.is_node_material
  1489. * @param {Object3D} obj Object 3D
  1490. * @param {string} mat_name Material name
  1491. * @returns {boolean} The result of the checking.
  1492. * @example var m_scenes = require("scenes");
  1493. * var m_mat = require("material");
  1494. *
  1495. * var cube = m_scenes.get_object_by_name("Cube");
  1496. * var has_nodes = m_mat.is_node_material(cube, "MyMaterial");
  1497. */
  1498. exports.is_node_material = function(obj, mat_name) {
  1499. if (!m_obj_util.is_dynamic_mesh(obj)) {
  1500. m_print.error("is_node_material(): Object \"" + obj.name
  1501. + "\" is not a dynamic MESH.");
  1502. return false;
  1503. }
  1504. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  1505. if (!batch) {
  1506. m_print.error("is_node_material(): Material \"" + mat_name
  1507. + "\" wasn't found on the object \"" + obj.name + "\".");
  1508. return false;
  1509. }
  1510. return batch.has_nodes;
  1511. }
  1512. /**
  1513. * Check if the object's material is a water material.
  1514. * @method module:material.is_water_material
  1515. * @param {Object3D} obj Object 3D
  1516. * @param {string} mat_name Material name
  1517. * @returns {boolean} The result of the checking.
  1518. * @example var m_scenes = require("scenes");
  1519. * var m_mat = require("material");
  1520. *
  1521. * var cube = m_scenes.get_object_by_name("Cube");
  1522. * var is_water = m_mat.is_water_material(cube, "MyMaterial");
  1523. */
  1524. exports.is_water_material = function(obj, mat_name) {
  1525. if (!m_obj_util.is_dynamic_mesh(obj)) {
  1526. m_print.error("is_water_material(): Object \"" + obj.name
  1527. + "\" is not a dynamic MESH.");
  1528. return false;
  1529. }
  1530. var batch = m_batch.find_batch_material(obj, mat_name, "MAIN");
  1531. if (!batch) {
  1532. m_print.error("is_water_material(): Material \"" + mat_name
  1533. + "\" wasn't found on the object \"" + obj.name + "\".");
  1534. return false;
  1535. }
  1536. return batch.water && !batch.has_nodes;
  1537. }
  1538. }
  1539. var material_factory = register("material", Material);
  1540. export default material_factory;