util_particle.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. ///if (is_paint || is_sculpt)
  2. function util_particle_init() {
  3. if (context_raw.particle_material != null) return;
  4. let raw: particle_data_t = {
  5. name: "Particles",
  6. type: 0,
  7. loop: false,
  8. count: 1000,
  9. frame_start: 0,
  10. frame_end: 1000,
  11. lifetime: 400,
  12. lifetime_random: 0.5,
  13. emit_from: 1,
  14. object_align_factor: f32_array_create_xyz(0, 0, -40),
  15. factor_random: 2.0,
  16. physics_type: 0,
  17. particle_size: 1.0,
  18. size_random: 0,
  19. mass: 1,
  20. instance_object: ".Particle",
  21. weight_gravity: 1
  22. };
  23. _scene_raw.particle_datas = [raw];
  24. let particle_refs: particle_ref_t[] = [
  25. {
  26. name: "Particles",
  27. particle: "Particles",
  28. seed: 0
  29. }
  30. ];
  31. {
  32. let t: render_target_t = render_target_create();
  33. t.name = "texparticle";
  34. t.width = 0;
  35. t.height = 0;
  36. t.format = "R8";
  37. t.scale = render_path_base_get_super_sampling();
  38. render_path_create_render_target(t);
  39. }
  40. for (let i: i32 = 0; i < _scene_raw.material_datas.length; ++i) {
  41. let mat: material_data_t = _scene_raw.material_datas[i];
  42. if (mat.name == "Material2") {
  43. let m: material_data_t = json_parse(json_stringify(mat));
  44. m.name = "MaterialParticle";
  45. array_push(_scene_raw.material_datas, m);
  46. break;
  47. }
  48. }
  49. let md: material_data_t = data_get_material("Scene", "MaterialParticle");
  50. context_raw.particle_material = md;
  51. for (let i: i32 = 0; i < _scene_raw.objects.length; ++i) {
  52. let obj: obj_t = _scene_raw.objects[i];
  53. if (obj.name == ".Sphere") {
  54. let particle: obj_t = json_parse(json_stringify(obj));
  55. particle.name = ".Particle";
  56. if (particle.particles == null) {
  57. particle.particles = {};
  58. }
  59. particle.particles.is_particle = true;
  60. particle.material_refs = ["MaterialParticle"];
  61. array_push(_scene_raw.objects, particle);
  62. for (let i: i32 = 0; i < 16; ++i) {
  63. particle.transform[i] *= 0.01;
  64. }
  65. break;
  66. }
  67. }
  68. let o: object_t = scene_spawn_object(".Sphere");
  69. let mo: mesh_object_t = o.ext;
  70. mo.base.name = ".ParticleEmitter";
  71. mo.base.raw = json_parse(json_stringify(mo.base.raw));
  72. mo.base.raw.particles.refs = particle_refs;
  73. ///if arm_particles
  74. mesh_object_setup_particle_system(mo, "Scene", particle_refs[0]);
  75. ///end
  76. }
  77. ///if arm_physics
  78. function util_particle_init_physics() {
  79. if (physics_world_active != null) {
  80. util_particle_init_mesh();
  81. return;
  82. }
  83. physics_world_load(function () {
  84. physics_world_create();
  85. util_particle_init_mesh();
  86. });
  87. }
  88. function util_particle_init_mesh() {
  89. if (context_raw.paint_body != null) {
  90. return;
  91. }
  92. let po: mesh_object_t = context_raw.merged_object != null ? context_raw.merged_object : context_raw.paint_object;
  93. po.base.transform.scale.x = po.base.parent.transform.scale.x;
  94. po.base.transform.scale.y = po.base.parent.transform.scale.y;
  95. po.base.transform.scale.z = po.base.parent.transform.scale.z;
  96. context_raw.paint_body = physics_body_create();
  97. context_raw.paint_body.shape = shape_type_t.MESH;
  98. physics_body_init(context_raw.paint_body, po.base);
  99. map_set(physics_body_object_map, po.base, context_raw.paint_body);
  100. }
  101. ///end
  102. ///end