demo-builder.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import {THREE} from './base/three-defs.js';
  2. import * as entity from './base/entity.js';
  3. import * as terrain_component from './base/render/terrain-component.js';
  4. import * as shaders from './game/render/shaders.js';
  5. export const demo_builder = (() => {
  6. class DemoBuilder extends entity.Component {
  7. static CLASS_NAME = 'DemoBuilder';
  8. get NAME() {
  9. return DemoBuilder.CLASS_NAME;
  10. }
  11. constructor(params) {
  12. super();
  13. this.params_ = params;
  14. this.spawned_ = false;
  15. this.materials_ = {};
  16. }
  17. LoadMaterial_(albedoName, normalName, roughnessName, metalnessName) {
  18. const textureLoader = new THREE.TextureLoader();
  19. const albedo = textureLoader.load('./textures/' + albedoName);
  20. albedo.anisotropy = this.FindEntity('threejs').GetComponent('ThreeJSController').getMaxAnisotropy();
  21. albedo.wrapS = THREE.RepeatWrapping;
  22. albedo.wrapT = THREE.RepeatWrapping;
  23. albedo.colorSpace = THREE.SRGBColorSpace;
  24. const material = new shaders.GameMaterial('PHONG', {
  25. map: albedo,
  26. color: 0x303030,
  27. });
  28. return material;
  29. }
  30. BuildHackModel_() {
  31. this.materials_.checkerboard = this.LoadMaterial_(
  32. 'whitesquare.png', null, null, null);
  33. const ground = new THREE.Mesh(
  34. new THREE.BoxGeometry(1, 1, 1, 10, 10, 10),
  35. this.materials_.checkerboard);
  36. ground.castShadow = true;
  37. ground.receiveShadow = true;
  38. this.FindEntity('loader').GetComponent('LoadController').AddModel(ground, 'built-in.', 'ground');
  39. const box = new THREE.Mesh(
  40. new THREE.BoxGeometry(1, 1, 1, 10, 10, 10),
  41. this.materials_.checkerboard);
  42. box.castShadow = true;
  43. box.receiveShadow = true;
  44. this.FindEntity('loader').GetComponent('LoadController').AddModel(box, 'built-in.', 'box');
  45. const sphere = new THREE.Mesh(
  46. new THREE.SphereGeometry(1, 16, 16),
  47. this.materials_.checkerboard);
  48. sphere.castShadow = true;
  49. sphere.receiveShadow = true;
  50. this.FindEntity('loader').GetComponent('LoadController').AddModel(sphere, 'built-in.', 'sphere');
  51. this.currentTime_ = 0.0;
  52. }
  53. Update(timeElapsed) {
  54. this.currentTime_ += timeElapsed;
  55. if (this.materials_.checkerboard && this.materials_.checkerboard.userData.shader) {
  56. this.materials_.checkerboard.userData.shader.uniforms.iTime.value = this.currentTime_;
  57. this.materials_.checkerboard.needsUpdate = true;
  58. }
  59. if (this.spawned_) {
  60. return;
  61. }
  62. this.spawned_ = true;
  63. this.BuildHackModel_();
  64. const terrain = new entity.Entity('terrain');
  65. terrain.AddComponent(new terrain_component.TerrainComponent({}));
  66. terrain.SetActive(true);
  67. terrain.Init();
  68. }
  69. };
  70. return {
  71. DemoBuilder: DemoBuilder
  72. };
  73. })();