webgl-debug.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. var createNodeMaterial = function(scene) {
  2. var nodeMaterial = new BABYLON.NodeMaterial("node", scene, { emitComments: true });
  3. // nodeMaterial.setToDefault();
  4. // Blocks
  5. // Vertex
  6. var positionInput = new BABYLON.InputBlock("position");
  7. positionInput.setAsAttribute("position");
  8. var worldInput = new BABYLON.InputBlock("world");
  9. worldInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.World);
  10. var worldPos = new BABYLON.Vector4TransformBlock("worldPos");
  11. positionInput.connectTo(worldPos);
  12. worldInput.connectTo(worldPos);
  13. var normalInput = new BABYLON.InputBlock("normal");
  14. normalInput.setAsAttribute("normal");
  15. var worldNormal = new BABYLON.Vector4TransformBlock("worldNormal");
  16. normalInput.connectTo(worldNormal);
  17. worldInput.connectTo(worldNormal);
  18. var viewProjectionInput = new BABYLON.InputBlock("viewProjection");
  19. viewProjectionInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.ViewProjection);
  20. var worldPosdMultipliedByViewProjection = new BABYLON.Vector4TransformBlock("worldPos * viewProjectionTransform");
  21. worldPos.connectTo(worldPosdMultipliedByViewProjection);
  22. viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);
  23. var vertexOutput = new BABYLON.VertexOutputBlock("vertexOutput");
  24. worldPosdMultipliedByViewProjection.connectTo(vertexOutput);
  25. // Pixel
  26. var colorInput = new BABYLON.InputBlock("color");
  27. colorInput.value = new BABYLON.Color3(1, 0, 0);
  28. var colorMultiplier = new BABYLON.MultiplyBlock("color multiplier");
  29. colorInput.connectTo(colorMultiplier);
  30. var lightNode = new BABYLON.LightBlock("All Lights");
  31. worldPos.output.connectTo(lightNode.worldPosition);
  32. worldNormal.output.connectTo(lightNode.worldNormal);
  33. lightNode.diffuseOutput.connectTo(colorMultiplier.right);
  34. var pixelOutput = new BABYLON.FragmentOutputBlock("pixelOutput");
  35. colorMultiplier.connectTo(pixelOutput);
  36. // Add to nodes
  37. nodeMaterial.addOutputNode(vertexOutput);
  38. nodeMaterial.addOutputNode(pixelOutput);
  39. // Build
  40. nodeMaterial.build(true);
  41. scene.debugLayer.show();
  42. scene.debugLayer.select(nodeMaterial);
  43. return nodeMaterial;
  44. }
  45. var createScene = function() {
  46. // This creates a basic Babylon Scene object (non-mesh)
  47. var scene = new BABYLON.Scene(engine);
  48. // This creates and positions a free camera (non-mesh)
  49. var camera = new BABYLON.ArcRotateCamera("camera1", 1.14, 1.13, 10, BABYLON.Vector3.Zero(), scene);
  50. // This targets the camera to scene origin
  51. camera.setTarget(BABYLON.Vector3.Zero());
  52. // This attaches the camera to the canvas
  53. camera.attachControl(canvas, true);
  54. // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
  55. var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene);
  56. // Default intensity is 1. Let's dim the light a small amount
  57. light.intensity = 0.7;
  58. var light2 = new BABYLON.PointLight("light2", new BABYLON.Vector3(0, -11, 5), scene);
  59. // Default intensity is 1. Let's dim the light a small amount
  60. light2.intensity = 0.7;
  61. // Our built-in 'sphere' shape. Params: name, subdivs, size, scene
  62. var sphere = BABYLON.Mesh.CreateSphere("sphere1", 16, 2, scene);
  63. sphere.material = createNodeMaterial(scene);
  64. return scene;
  65. };
  66. /////////////////////////
  67. var createNodeMaterial = function(scene) {
  68. var nodeMaterial = new BABYLON.NodeMaterial("node", scene, { emitComments: true });
  69. // nodeMaterial.setToDefault();
  70. // Blocks
  71. // Vertex
  72. var positionInput = new BABYLON.InputBlock("position");
  73. positionInput.setAsAttribute("position");
  74. var worldInput = new BABYLON.InputBlock("world");
  75. worldInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.World);
  76. var worldPos = new BABYLON.Vector4TransformBlock("worldPos");
  77. positionInput.connectTo(worldPos);
  78. worldInput.connectTo(worldPos);
  79. var normalInput = new BABYLON.InputBlock("normal");
  80. normalInput.setAsAttribute("normal");
  81. var worldNormal = new BABYLON.Vector4TransformBlock("worldNormal");
  82. normalInput.connectTo(worldNormal);
  83. worldInput.connectTo(worldNormal);
  84. var viewProjectionInput = new BABYLON.InputBlock("viewProjection");
  85. viewProjectionInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.ViewProjection);
  86. var worldPosdMultipliedByViewProjection = new BABYLON.Vector4TransformBlock("worldPos * viewProjectionTransform");
  87. worldPos.connectTo(worldPosdMultipliedByViewProjection);
  88. viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);
  89. var vertexOutput = new BABYLON.VertexOutputBlock("vertexOutput");
  90. worldPosdMultipliedByViewProjection.connectTo(vertexOutput);
  91. // Pixel
  92. var colorInput = new BABYLON.InputBlock("color");
  93. colorInput.value = new BABYLON.Color4(1, 0, 0, 1);
  94. var colorMultiplier2 = new BABYLON.MultiplyBlock("color multiplier2");
  95. var diffuseTextureBlock = new BABYLON.TextureBlock("diffuseTexture");
  96. diffuseTextureBlock.texture = new BABYLON.Texture("/playground/textures/bloc.jpg");
  97. diffuseTextureBlock.connectTo(colorMultiplier2);
  98. colorInput.connectTo(colorMultiplier2);
  99. var pixelOutput = new BABYLON.FragmentOutputBlock("pixelOutput");
  100. colorMultiplier2.connectTo(pixelOutput);
  101. // Add to nodes
  102. nodeMaterial.addOutputNode(vertexOutput);
  103. nodeMaterial.addOutputNode(pixelOutput);
  104. // Build
  105. nodeMaterial.build(true);
  106. scene.debugLayer.show();
  107. scene.debugLayer.select(nodeMaterial);
  108. return nodeMaterial;
  109. }
  110. var createScene = function() {
  111. // This creates a basic Babylon Scene object (non-mesh)
  112. var scene = new BABYLON.Scene(engine);
  113. // This creates and positions a free camera (non-mesh)
  114. var camera = new BABYLON.ArcRotateCamera("camera1", 1.14, 1.13, 10, BABYLON.Vector3.Zero(), scene);
  115. // This targets the camera to scene origin
  116. camera.setTarget(BABYLON.Vector3.Zero());
  117. // This attaches the camera to the canvas
  118. camera.attachControl(canvas, true);
  119. // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
  120. var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene);
  121. // Default intensity is 1. Let's dim the light a small amount
  122. light.intensity = 0.7;
  123. var light2 = new BABYLON.PointLight("light2", new BABYLON.Vector3(0, -11, 5), scene);
  124. // Default intensity is 1. Let's dim the light a small amount
  125. light2.intensity = 0.7;
  126. // Our built-in 'sphere' shape. Params: name, subdivs, size, scene
  127. var sphere = BABYLON.Mesh.CreateSphere("sphere1", 16, 2, scene);
  128. sphere.material = createNodeMaterial(scene);
  129. return scene;
  130. };
  131. /*
  132. - bones
  133. */
  134. var createNodeMaterial = function(scene) {
  135. var nodeMaterial = new BABYLON.NodeMaterial("node", scene, { emitComments: true });
  136. // nodeMaterial.setToDefault();
  137. // Blocks
  138. // Vertex
  139. var positionInput = new BABYLON.InputBlock("position");
  140. positionInput.setAsAttribute("position");
  141. var worldInput = new BABYLON.InputBlock("world");
  142. worldInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.World);
  143. var worldPos = new BABYLON.Vector4TransformBlock("worldPos");
  144. positionInput.connectTo(worldPos);
  145. worldInput.connectTo(worldPos);
  146. var normalInput = new BABYLON.InputBlock("normal");
  147. normalInput.setAsAttribute("normal");
  148. var worldNormal = new BABYLON.Vector4TransformBlock("worldNormal");
  149. normalInput.connectTo(worldNormal);
  150. worldInput.connectTo(worldNormal);
  151. var viewProjectionInput = new BABYLON.InputBlock("viewProjection");
  152. viewProjectionInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.ViewProjection);
  153. var worldPosdMultipliedByViewProjection = new BABYLON.Vector4TransformBlock("worldPos * viewProjectionTransform");
  154. worldPos.connectTo(worldPosdMultipliedByViewProjection);
  155. viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);
  156. var vertexOutput = new BABYLON.VertexOutputBlock("vertexOutput");
  157. worldPosdMultipliedByViewProjection.connectTo(vertexOutput);
  158. // Pixel
  159. var colorInput = new BABYLON.InputBlock("color");
  160. colorInput.value = new BABYLON.Color4(1, 0, 0, 1);
  161. var colorMultiplier = new BABYLON.MultiplyBlock("color multiplier");
  162. var diffuseTextureBlock = new BABYLON.TextureBlock("diffuseTexture");
  163. diffuseTextureBlock.texture = new BABYLON.Texture("/playground/textures/bloc.jpg");
  164. var diffuse2TextureBlock = new BABYLON.TextureBlock("diffuseTexture2");
  165. diffuse2TextureBlock.texture = new BABYLON.Texture("/playground/textures/crate.png");
  166. diffuseTextureBlock.connectTo(colorMultiplier);
  167. diffuse2TextureBlock.connectTo(colorMultiplier);
  168. var colorMultiplier2 = new BABYLON.MultiplyBlock("color multiplier2");
  169. colorMultiplier.connectTo(colorMultiplier2);
  170. colorInput.connectTo(colorMultiplier2);
  171. var fog = new BABYLON.FogBlock("fog");
  172. worldPos.connectTo(fog);
  173. colorMultiplier2.connectTo(fog);
  174. var pixelOutput = new BABYLON.FragmentOutputBlock("pixelOutput");
  175. fog.connectTo(pixelOutput);
  176. // Add to nodes
  177. nodeMaterial.addOutputNode(vertexOutput);
  178. nodeMaterial.addOutputNode(pixelOutput);
  179. // Build
  180. nodeMaterial.build(true);
  181. scene.debugLayer.show();
  182. scene.debugLayer.select(nodeMaterial);
  183. return nodeMaterial;
  184. }
  185. var createScene = function() {
  186. // This creates a basic Babylon Scene object (non-mesh)
  187. var scene = new BABYLON.Scene(engine);
  188. // This creates and positions a free camera (non-mesh)
  189. var camera = new BABYLON.ArcRotateCamera("camera1", 1.14, 1.13, 10, BABYLON.Vector3.Zero(), scene);
  190. // This targets the camera to scene origin
  191. camera.setTarget(BABYLON.Vector3.Zero());
  192. // This attaches the camera to the canvas
  193. camera.attachControl(canvas, true);
  194. // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
  195. var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene);
  196. // Default intensity is 1. Let's dim the light a small amount
  197. light.intensity = 0.7;
  198. var light2 = new BABYLON.PointLight("light2", new BABYLON.Vector3(0, -11, 5), scene);
  199. // Default intensity is 1. Let's dim the light a small amount
  200. light2.intensity = 0.7;
  201. // Our built-in 'sphere' shape. Params: name, subdivs, size, scene
  202. var sphere = BABYLON.Mesh.CreateSphere("sphere1", 16, 2, scene);
  203. sphere.material = createNodeMaterial(scene);
  204. scene.fogMode = BABYLON.Scene.FOGMODE_LINEAR;
  205. scene.fogColor = scene.clearColor.clone();
  206. scene.fogStart = 2.0;
  207. scene.fogEnd = 40.0;
  208. return scene;
  209. };
  210. ////////////////////
  211. var createNodeMaterial = function(scene) {
  212. var nodeMaterial = new BABYLON.NodeMaterial("node", scene, { emitComments: true });
  213. // nodeMaterial.setToDefault();
  214. // Blocks
  215. // Vertex
  216. var morphTargets = new BABYLON.MorphTargetsBlock("morphTargets");
  217. var worldInput = new BABYLON.InputBlock("world");
  218. worldInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.World);
  219. var worldPos = new BABYLON.Vector4TransformBlock("worldPos");
  220. morphTargets.connectTo(worldPos);
  221. worldInput.connectTo(worldPos);
  222. var normalInput = new BABYLON.InputBlock("normal");
  223. normalInput.setAsAttribute("normal");
  224. var worldNormal = new BABYLON.Vector4TransformBlock("worldNormal");
  225. normalInput.connectTo(worldNormal);
  226. worldInput.connectTo(worldNormal);
  227. var viewProjectionInput = new BABYLON.InputBlock("viewProjection");
  228. viewProjectionInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.ViewProjection);
  229. var worldPosdMultipliedByViewProjection = new BABYLON.Vector4TransformBlock("worldPos * viewProjectionTransform");
  230. worldPos.connectTo(worldPosdMultipliedByViewProjection);
  231. viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);
  232. var vertexOutput = new BABYLON.VertexOutputBlock("vertexOutput");
  233. worldPosdMultipliedByViewProjection.connectTo(vertexOutput);
  234. // Pixel
  235. var colorInput = new BABYLON.InputBlock("color");
  236. colorInput.value = new BABYLON.Color4(1, 0, 0, 1);
  237. var colorMultiplier = new BABYLON.MultiplyBlock("color multiplier");
  238. var diffuseTextureBlock = new BABYLON.TextureBlock("diffuseTexture");
  239. diffuseTextureBlock.texture = new BABYLON.Texture("/playground/textures/bloc.jpg");
  240. var diffuse2TextureBlock = new BABYLON.TextureBlock("diffuseTexture2");
  241. diffuse2TextureBlock.texture = new BABYLON.Texture("/playground/textures/crate.png");
  242. diffuseTextureBlock.connectTo(colorMultiplier);
  243. diffuse2TextureBlock.connectTo(colorMultiplier);
  244. var colorMultiplier2 = new BABYLON.MultiplyBlock("color multiplier2");
  245. colorMultiplier.connectTo(colorMultiplier2);
  246. colorInput.connectTo(colorMultiplier2);
  247. var fog = new BABYLON.FogBlock("fog");
  248. worldPos.connectTo(fog);
  249. colorMultiplier2.connectTo(fog);
  250. var pixelOutput = new BABYLON.FragmentOutputBlock("pixelOutput");
  251. fog.connectTo(pixelOutput);
  252. // Add to nodes
  253. nodeMaterial.addOutputNode(vertexOutput);
  254. nodeMaterial.addOutputNode(pixelOutput);
  255. // Build
  256. nodeMaterial.build(true);
  257. scene.debugLayer.show();
  258. scene.debugLayer.select(nodeMaterial);
  259. return nodeMaterial;
  260. }
  261. var addSpike = function(mesh) {
  262. var positions = mesh.getVerticesData(BABYLON.VertexBuffer.PositionKind);
  263. var normals = mesh.getVerticesData(BABYLON.VertexBuffer.NormalKind);
  264. var indices = mesh.getIndices();
  265. for (var index = 0; index < 5; index++) {
  266. var randomVertexID = (mesh.getTotalVertices() * Math.random()) | 0;
  267. var position = BABYLON.Vector3.FromArray(positions, randomVertexID * 3);
  268. var normal = BABYLON.Vector3.FromArray(normals, randomVertexID * 3);
  269. position.addInPlace(normal);
  270. position.toArray(positions, randomVertexID * 3);
  271. }
  272. BABYLON.VertexData.ComputeNormals(positions, indices, normals);
  273. mesh.updateVerticesData(BABYLON.VertexBuffer.PositionKind, positions, false, false);
  274. mesh.updateVerticesData(BABYLON.VertexBuffer.NormalKind, normals, false, false);
  275. }
  276. var createScene = function() {
  277. // This creates a basic Babylon Scene object (non-mesh)
  278. var scene = new BABYLON.Scene(engine);
  279. // This creates and positions a free camera (non-mesh)
  280. var camera = new BABYLON.ArcRotateCamera("camera1", 1.14, 1.13, 10, BABYLON.Vector3.Zero(), scene);
  281. // This targets the camera to scene origin
  282. camera.setTarget(BABYLON.Vector3.Zero());
  283. // This attaches the camera to the canvas
  284. camera.attachControl(canvas, true);
  285. // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
  286. var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene);
  287. // Default intensity is 1. Let's dim the light a small amount
  288. light.intensity = 0.7;
  289. var light2 = new BABYLON.PointLight("light2", new BABYLON.Vector3(0, -11, 5), scene);
  290. // Default intensity is 1. Let's dim the light a small amount
  291. light2.intensity = 0.7;
  292. // Our built-in 'sphere' shape. Params: name, subdivs, size, scene
  293. var sphere = BABYLON.Mesh.CreateSphere("sphere1", 16, 2, scene);
  294. sphere.material = createNodeMaterial(scene);
  295. scene.fogMode = BABYLON.Scene.FOGMODE_LINEAR;
  296. scene.fogColor = scene.clearColor.clone();
  297. scene.fogStart = 2.0;
  298. scene.fogEnd = 40.0;
  299. var sphere2 = BABYLON.Mesh.CreateSphere("sphere2", 16, 2, scene);
  300. sphere2.setEnabled(false);
  301. addSpike(sphere2);
  302. var sphere3 = BABYLON.Mesh.CreateSphere("sphere3", 16, 2, scene);
  303. sphere3.setEnabled(false);
  304. addSpike(sphere3);
  305. var sphere4 = BABYLON.Mesh.CreateSphere("sphere4", 16, 2, scene);
  306. sphere4.setEnabled(false);
  307. addSpike(sphere4);
  308. var sphere5 = BABYLON.Mesh.CreateSphere("sphere5", 16, 2, scene);
  309. sphere5.setEnabled(false);
  310. addSpike(sphere5);
  311. var manager = new BABYLON.MorphTargetManager();
  312. sphere.morphTargetManager = manager;
  313. var target0 = BABYLON.MorphTarget.FromMesh(sphere2, "sphere2", 0.25);
  314. manager.addTarget(target0);
  315. var target1 = BABYLON.MorphTarget.FromMesh(sphere3, "sphere3", 0.25);
  316. manager.addTarget(target1);
  317. var target2 = BABYLON.MorphTarget.FromMesh(sphere4, "sphere4", 0.25);
  318. manager.addTarget(target2);
  319. var target3 = BABYLON.MorphTarget.FromMesh(sphere5, "sphere5", 0.25);
  320. manager.addTarget(target3);
  321. // GUI
  322. var advancedTexture = BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI("UI");
  323. var panel = new BABYLON.GUI.StackPanel();
  324. panel.width = "220px";
  325. panel.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT;
  326. panel.verticalAlignment = BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER;
  327. advancedTexture.addControl(panel);
  328. var addSlider = function(text, callback) {
  329. var header = new BABYLON.GUI.TextBlock();
  330. header.text = text;
  331. header.height = "30px";
  332. header.color = "white";
  333. panel.addControl(header);
  334. var slider = new BABYLON.GUI.Slider();
  335. slider.minimum = 0;
  336. slider.maximum = 1;
  337. slider.value = 0;
  338. slider.height = "20px";
  339. slider.width = "200px";
  340. slider.onValueChangedObservable.add(function(value) {
  341. callback(value);
  342. });
  343. panel.addControl(slider);
  344. }
  345. addSlider("Influence #1", (value) => {
  346. target0.influence = value;
  347. });
  348. addSlider("Influence #2", (value) => {
  349. target1.influence = value;
  350. });
  351. addSlider("Influence #3", (value) => {
  352. target2.influence = value;
  353. });
  354. addSlider("Influence #4", (value) => {
  355. target3.influence = value;
  356. });
  357. return scene;
  358. };
  359. //////
  360. var createNodeMaterial = function(scene) {
  361. var nodeMaterial = new BABYLON.NodeMaterial("node", scene, { emitComments: true });
  362. // nodeMaterial.setToDefault();
  363. // Blocks
  364. // Vertex
  365. var morphTargets = new BABYLON.MorphTargetsBlock("morphTargets");
  366. var bonesBlock = new BABYLON.BonesBlock("bonesBlock");
  367. var worldPos = new BABYLON.Vector4TransformBlock("worldPos");
  368. morphTargets.connectTo(worldPos);
  369. bonesBlock.connectTo(worldPos);
  370. var normalInput = new BABYLON.InputBlock("normal");
  371. normalInput.setAsAttribute("normal");
  372. var worldNormal = new BABYLON.Vector4TransformBlock("worldNormal");
  373. normalInput.connectTo(worldNormal);
  374. bonesBlock.connectTo(worldNormal);
  375. var viewProjectionInput = new BABYLON.InputBlock("viewProjection");
  376. viewProjectionInput.setAsWellKnownValue(BABYLON.NodeMaterialWellKnownValues.ViewProjection);
  377. var worldPosdMultipliedByViewProjection = new BABYLON.Vector4TransformBlock("worldPos * viewProjectionTransform");
  378. worldPos.connectTo(worldPosdMultipliedByViewProjection);
  379. viewProjectionInput.connectTo(worldPosdMultipliedByViewProjection);
  380. var vertexOutput = new BABYLON.VertexOutputBlock("vertexOutput");
  381. worldPosdMultipliedByViewProjection.connectTo(vertexOutput);
  382. // Pixel
  383. var colorInput = new BABYLON.InputBlock("color");
  384. colorInput.value = new BABYLON.Color4(1, 0, 0, 1);
  385. var colorMultiplier = new BABYLON.MultiplyBlock("color multiplier");
  386. var diffuseTextureBlock = new BABYLON.TextureBlock("diffuseTexture");
  387. diffuseTextureBlock.texture = new BABYLON.Texture("/playground/textures/bloc.jpg");
  388. var diffuse2TextureBlock = new BABYLON.TextureBlock("diffuseTexture2");
  389. diffuse2TextureBlock.texture = new BABYLON.Texture("/playground/textures/crate.png");
  390. diffuseTextureBlock.connectTo(colorMultiplier);
  391. diffuse2TextureBlock.connectTo(colorMultiplier);
  392. var colorMultiplier2 = new BABYLON.MultiplyBlock("color multiplier2");
  393. colorMultiplier.connectTo(colorMultiplier2);
  394. colorInput.connectTo(colorMultiplier2);
  395. var fog = new BABYLON.FogBlock("fog");
  396. worldPos.connectTo(fog);
  397. colorMultiplier2.connectTo(fog);
  398. var pixelOutput = new BABYLON.FragmentOutputBlock("pixelOutput");
  399. fog.connectTo(pixelOutput);
  400. // Add to nodes
  401. nodeMaterial.addOutputNode(vertexOutput);
  402. nodeMaterial.addOutputNode(pixelOutput);
  403. // Build
  404. nodeMaterial.build(true);
  405. scene.debugLayer.show();
  406. scene.debugLayer.select(nodeMaterial);
  407. return nodeMaterial;
  408. }
  409. var delayCreateScene = function() {
  410. // Model by Mixamo
  411. engine.enableOfflineSupport = false;
  412. // This is really important to tell Babylon.js to use decomposeLerp and matrix interpolation
  413. BABYLON.Animation.AllowMatricesInterpolation = true;
  414. var scene = new BABYLON.Scene(engine);
  415. var camera = new BABYLON.ArcRotateCamera("camera1", Math.PI / 2, Math.PI / 4, 3, new BABYLON.Vector3(0, 1, 0), scene);
  416. camera.attachControl(canvas, true);
  417. camera.lowerRadiusLimit = 2;
  418. camera.upperRadiusLimit = 10;
  419. camera.wheelDeltaPercentage = 0.01;
  420. var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 1, 0), scene);
  421. light.intensity = 0.6;
  422. light.specular = BABYLON.Color3.Black();
  423. var light2 = new BABYLON.DirectionalLight("dir01", new BABYLON.Vector3(0, -0.5, -1.0), scene);
  424. light2.position = new BABYLON.Vector3(0, 5, 5);
  425. // Shadows
  426. var shadowGenerator = new BABYLON.ShadowGenerator(1024, light2);
  427. shadowGenerator.useBlurExponentialShadowMap = true;
  428. shadowGenerator.blurKernel = 32;
  429. engine.displayLoadingUI();
  430. BABYLON.SceneLoader.ImportMesh("", "/playground/scenes/", "dummy3.babylon", scene, function(newMeshes, particleSystems, skeletons) {
  431. var skeleton = skeletons[0];
  432. shadowGenerator.addShadowCaster(scene.meshes[0], true);
  433. for (var index = 0; index < newMeshes.length; index++) {
  434. newMeshes[index].receiveShadows = false;;
  435. }
  436. newMeshes[0].material = createNodeMaterial(scene);
  437. var helper = scene.createDefaultEnvironment({
  438. enableGroundShadow: true
  439. });
  440. helper.setMainColor(BABYLON.Color3.Gray());
  441. helper.ground.position.y += 0.01;
  442. // ROBOT
  443. skeleton.animationPropertiesOverride = new BABYLON.AnimationPropertiesOverride();
  444. skeleton.animationPropertiesOverride.enableBlending = true;
  445. skeleton.animationPropertiesOverride.blendingSpeed = 0.05;
  446. skeleton.animationPropertiesOverride.loopMode = 1;
  447. var idleRange = skeleton.getAnimationRange("YBot_Idle");
  448. var walkRange = skeleton.getAnimationRange("YBot_Walk");
  449. var runRange = skeleton.getAnimationRange("YBot_Run");
  450. var leftRange = skeleton.getAnimationRange("YBot_LeftStrafeWalk");
  451. var rightRange = skeleton.getAnimationRange("YBot_RightStrafeWalk");
  452. // IDLE
  453. if (idleRange) scene.beginAnimation(skeleton, idleRange.from, idleRange.to, true);
  454. // UI
  455. var advancedTexture = BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI("UI");
  456. var UiPanel = new BABYLON.GUI.StackPanel();
  457. UiPanel.width = "220px";
  458. UiPanel.fontSize = "14px";
  459. UiPanel.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT;
  460. UiPanel.verticalAlignment = BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER;
  461. advancedTexture.addControl(UiPanel);
  462. // ..
  463. var button = BABYLON.GUI.Button.CreateSimpleButton("but1", "Play Idle");
  464. button.paddingTop = "10px";
  465. button.width = "100px";
  466. button.height = "50px";
  467. button.color = "white";
  468. button.background = "green";
  469. button.onPointerDownObservable.add(() => {
  470. if (idleRange) scene.beginAnimation(skeleton, idleRange.from, idleRange.to, true);
  471. });
  472. UiPanel.addControl(button);
  473. // ..
  474. var button1 = BABYLON.GUI.Button.CreateSimpleButton("but2", "Play Walk");
  475. button1.paddingTop = "10px";
  476. button1.width = "100px";
  477. button1.height = "50px";
  478. button1.color = "white";
  479. button1.background = "green";
  480. button1.onPointerDownObservable.add(() => {
  481. if (walkRange) scene.beginAnimation(skeleton, walkRange.from, walkRange.to, true);
  482. });
  483. UiPanel.addControl(button1);
  484. // ..
  485. var button1 = BABYLON.GUI.Button.CreateSimpleButton("but3", "Play Run");
  486. button1.paddingTop = "10px";
  487. button1.width = "100px";
  488. button1.height = "50px";
  489. button1.color = "white";
  490. button1.background = "green";
  491. button1.onPointerDownObservable.add(() => {
  492. if (runRange) scene.beginAnimation(skeleton, runRange.from, runRange.to, true);
  493. });
  494. UiPanel.addControl(button1);
  495. // ..
  496. var button1 = BABYLON.GUI.Button.CreateSimpleButton("but4", "Play Left");
  497. button1.paddingTop = "10px";
  498. button1.width = "100px";
  499. button1.height = "50px";
  500. button1.color = "white";
  501. button1.background = "green";
  502. button1.onPointerDownObservable.add(() => {
  503. if (leftRange) scene.beginAnimation(skeleton, leftRange.from, leftRange.to, true);
  504. });
  505. UiPanel.addControl(button1);
  506. // ..
  507. var button1 = BABYLON.GUI.Button.CreateSimpleButton("but5", "Play Right");
  508. button1.paddingTop = "10px";
  509. button1.width = "100px";
  510. button1.height = "50px";
  511. button1.color = "white";
  512. button1.background = "green";
  513. button1.onPointerDownObservable.add(() => {
  514. if (rightRange) scene.beginAnimation(skeleton, rightRange.from, rightRange.to, true);
  515. });
  516. UiPanel.addControl(button1);
  517. // ..
  518. var button1 = BABYLON.GUI.Button.CreateSimpleButton("but6", "Play Blend");
  519. button1.paddingTop = "10px";
  520. button1.width = "100px";
  521. button1.height = "50px";
  522. button1.color = "white";
  523. button1.background = "green";
  524. button1.onPointerDownObservable.add(() => {
  525. if (walkRange && leftRange) {
  526. scene.stopAnimation(skeleton);
  527. var walkAnim = scene.beginWeightedAnimation(skeleton, walkRange.from, walkRange.to, 0.5, true);
  528. var leftAnim = scene.beginWeightedAnimation(skeleton, leftRange.from, leftRange.to, 0.5, true);
  529. // Note: Sync Speed Ratio With Master Walk Animation
  530. walkAnim.syncWith(null);
  531. leftAnim.syncWith(walkAnim);
  532. }
  533. });
  534. UiPanel.addControl(button1);
  535. engine.hideLoadingUI();
  536. });
  537. return scene;
  538. };