diff --git a/armorcore/sources/ts/data.ts b/armorcore/sources/ts/data.ts index 336fc47b..fa7a2024 100644 --- a/armorcore/sources/ts/data.ts +++ b/armorcore/sources/ts/data.ts @@ -5,7 +5,6 @@ let data_cached_meshes: map_t = map_create(); let data_cached_lights: map_t = map_create(); let data_cached_cameras: map_t = map_create(); let data_cached_materials: map_t = map_create(); -let data_cached_particles: map_t = map_create(); let data_cached_worlds: map_t = map_create(); let data_cached_shaders: map_t = map_create(); @@ -67,18 +66,6 @@ function data_get_material(file: string, name: string): material_data_t { return b; } -function data_get_particle(file: string, name: string): particle_data_t { - let handle: string = file + name; - let cached: particle_data_t = map_get(data_cached_particles, handle); - if (cached != null) { - return cached; - } - - let b: particle_data_t = particle_data_parse(file, name); - map_set(data_cached_particles, handle, b); - return b; -} - function data_get_world(file: string, name: string): world_data_t { if (name == null) { // No world defined in scene return null; @@ -267,7 +254,6 @@ function data_delete_all() { data_cached_lights = map_create(); data_cached_cameras = map_create(); data_cached_materials = map_create(); - data_cached_particles = map_create(); data_cached_worlds = map_create(); render_path_unload(); data_cached_blobs = map_create(); diff --git a/armorcore/sources/ts/mesh_object.ts b/armorcore/sources/ts/mesh_object.ts index 47b6d882..8c529f9b 100644 --- a/armorcore/sources/ts/mesh_object.ts +++ b/armorcore/sources/ts/mesh_object.ts @@ -4,12 +4,6 @@ type mesh_object_t = { data?: mesh_data_t; materials?: material_data_t[]; material_index?: i32; - ///if arm_particles - particle_systems?: particle_sys_t[]; // Particle owner - particle_children?: mesh_object_t[]; - particle_owner?: mesh_object_t; // Particle object - particle_index?: i32; - ///end camera_dist?: f32; screen_size?: f32; frustum_culling?: bool; @@ -25,9 +19,6 @@ let _mesh_object_shader_contexts: shader_context_t[] = []; function mesh_object_create(data: mesh_data_t, materials: material_data_t[]): mesh_object_t { let raw: mesh_object_t = {}; raw.material_index = 0; - ///if arm_particles - raw.particle_index = -1; - ///end raw.screen_size = 0.0; raw.frustum_culling = true; raw.prev_matrix = mat4_identity(); @@ -51,22 +42,6 @@ function mesh_object_set_data(raw: mesh_object_t, data: mesh_data_t) { } function mesh_object_remove(raw: mesh_object_t) { - ///if arm_particles - if (raw.particle_children != null) { - for (let i: i32 = 0; i < raw.particle_children.length; ++i) { - let c: mesh_object_t = raw.particle_children[i]; - mesh_object_remove(c); - } - raw.particle_children = null; - } - if (raw.particle_systems != null) { - for (let i: i32 = 0; i < raw.particle_systems.length; ++i) { - let psys: particle_sys_t = raw.particle_systems[i]; - particle_sys_remove(psys); - } - raw.particle_systems = null; - } - ///end array_remove(scene_meshes, raw); raw.data._.refcount--; @@ -93,16 +68,6 @@ function mesh_object_setup_animation(raw: mesh_object_t, oactions: scene_t[] = n ///end } -///if arm_particles -function mesh_object_setup_particle_system(raw: mesh_object_t, scene_name: string, pref: particle_ref_t) { - if (raw.particle_systems == null) { - raw.particle_systems = []; - } - let psys: particle_sys_t = particle_sys_create(scene_name, pref); - array_push(raw.particle_systems, psys); -} -///end - function mesh_object_set_culled(raw: mesh_object_t, b: bool): bool { raw.base.culled = b; return b; @@ -135,16 +100,7 @@ function mesh_object_cull_mesh(raw: mesh_object_t, context: string, camera: came } if (camera.data.frustum_culling && raw.frustum_culling) { - // Scale radius for skinned mesh and particle system - // TODO: define skin & particle bounds - let radius_scale: f32 = raw.data.skin != null ? 2.0 : 1.0; - ///if arm_particles - // particle_systems for update, particle_owner for render - if (raw.particle_systems != null || raw.particle_owner != null) { - radius_scale *= 1000; - } - ///end - + let radius_scale: f32 = 1.0; let frustum_planes: frustum_plane_t[] = camera.frustum_planes; if (!camera_object_sphere_in_frustum(frustum_planes, raw.base.transform, radius_scale)) { return mesh_object_set_culled(raw, true); @@ -184,36 +140,6 @@ function mesh_object_render(raw: mesh_object_t, context: string, bind_params: st if (mesh_object_cull_mesh(raw, context, scene_camera, _render_path_light)) { return; } - let mesh_context: bool = raw.base.raw != null ? context == "mesh" : false; - - ///if arm_particles - if (raw.base.raw != null && raw.base.raw.particles != null && raw.base.raw.particles.is_particle && raw.particle_owner == null) { - return; // Instancing not yet set-up by particle system owner - } - if (raw.particle_systems != null && mesh_context) { - if (raw.particle_children == null) { - raw.particle_children = []; - for (let i: i32 = 0; i < raw.particle_systems.length; ++i) { - let psys: particle_sys_t = raw.particle_systems[i]; - // let c: mesh_object_t = scene_get_child(psys.data.raw.instance_object); - let o: object_t = scene_spawn_object(psys.data.instance_object); - if (o != null) { - let c: mesh_object_t = o.ext; - array_push(raw.particle_children, c); - c.particle_owner = raw; - c.particle_index = raw.particle_children.length - 1; - } - } - } - for (let i: i32 = 0; i < raw.particle_systems.length; ++i) { - particle_sys_update(raw.particle_systems[i], raw.particle_children[i], raw); - } - } - if (raw.particle_systems != null && raw.particle_systems.length > 0 && raw.base.raw.particles != null && !raw.base.raw.particles.render_emitter) { - return; - } - ///end - if (mesh_object_cull_material(raw, context)) { return; } diff --git a/armorcore/sources/ts/particle_data.ts b/armorcore/sources/ts/particle_data.ts deleted file mode 100644 index 85c253fb..00000000 --- a/armorcore/sources/ts/particle_data.ts +++ /dev/null @@ -1,21 +0,0 @@ - -function particle_data_parse(name: string, id: string): particle_data_t { - let format: scene_t = data_get_scene_raw(name); - let raw: particle_data_t = particle_data_get_raw_by_name(format.particle_datas, id); - if (raw == null) { - iron_log("Particle data '" + id + "' not found!"); - } - return raw; -} - -function particle_data_get_raw_by_name(datas: particle_data_t[], name: string): particle_data_t { - if (name == "") { - return datas[0]; - } - for (let i: i32 = 0; i < datas.length; ++i) { - if (datas[i].name == name) { - return datas[i]; - } - } - return null; -} diff --git a/armorcore/sources/ts/particle_sys.ts b/armorcore/sources/ts/particle_sys.ts deleted file mode 100644 index a3d1ae2c..00000000 --- a/armorcore/sources/ts/particle_sys.ts +++ /dev/null @@ -1,250 +0,0 @@ - -///if arm_particles - -type particle_sys_t = { - data?: particle_data_t; - speed?: f32; - particles?: particle_t[]; - ready?: bool; - frame_rate?: i32; - lifetime?: f32; - animtime?: f32; - time?: f32; - spawn_rate?: f32; - seed?: i32; - - r?: particle_data_t; - gx?: f32; - gy?: f32; - gz?: f32; - alignx?: f32; - aligny?: f32; - alignz?: f32; - dimx?: f32; - dimy?: f32; - - count?: i32; - lap?: i32; - lap_time?: f32; - m?: mat4_t; - - owner_loc?: vec4_t; - owner_rot?: quat_t; - owner_scale?: vec4_t; -}; - -type particle_t = { - i?: i32; - x?: f32; - y?: f32; - z?: f32; - camera_dist?: f32; -}; - -function particle_create(): particle_t { - let raw: particle_t = {}; - raw.x = 0; - raw.y = 0; - raw.z = 0; - return raw; -} - -function particle_sys_create(scene_name: string, ref: particle_ref_t): particle_sys_t { - let raw: particle_sys_t = {}; - raw.speed = 1.0; - raw.frame_rate = 24; - raw.time = 0.0; - raw.seed = ref.seed; - raw.count = 0; - raw.lap = 0; - raw.lap_time = 0.0; - raw.m = mat4_identity(); - raw.owner_loc = vec4_create(); - raw.owner_rot = quat_create(); - raw.owner_scale = vec4_create(); - raw.particles = []; - raw.ready = false; - let b: particle_data_t = data_get_particle(scene_name, ref.particle); - raw.data = b; - raw.r = raw.data; - raw.gx = 0; - raw.gy = 0; - raw.gz = -9.81 * raw.r.weight_gravity; - raw.alignx = raw.r.object_align_factor[0] / 2; - raw.aligny = raw.r.object_align_factor[1] / 2; - raw.alignz = raw.r.object_align_factor[2] / 2; - raw.lifetime = raw.r.lifetime / raw.frame_rate; - raw.animtime = (raw.r.frame_end - raw.r.frame_start) / raw.frame_rate; - raw.spawn_rate = ((raw.r.frame_end - raw.r.frame_start) / raw.r.count) / raw.frame_rate; - for (let i: i32 = 0; i < raw.r.count; ++i) { - let p: particle_t = particle_create(); - p.i = i; - array_push(raw.particles, p); - } - raw.ready = true; - return raw; -} - -function particle_sys_pause(raw: particle_sys_t) { - raw.lifetime = 0; -} - -function particle_sys_resume(raw: particle_sys_t) { - raw.lifetime = raw.r.lifetime / raw.frame_rate; -} - -function particle_sys_update(raw: particle_sys_t, object: mesh_object_t, owner: mesh_object_t) { - if (!raw.ready || object == null || raw.speed == 0.0) { - return; - } - - // Copy owner world transform but discard scale - let dec: mat4_decomposed_t = mat4_decompose(owner.base.transform.world); - raw.owner_loc = dec.loc; - raw.owner_rot = dec.rot; - raw.owner_scale = dec.scl; - object.base.transform.loc = raw.owner_loc; - object.base.transform.rot = raw.owner_rot; - - // Set particle size per particle system - object.base.transform.scale = vec4_create(raw.r.particle_size, raw.r.particle_size, raw.r.particle_size, 1); - - transform_build_matrix(object.base.transform); - transform_build_matrix(owner.base.transform); - object.base.transform.dim = vec4_clone(owner.base.transform.dim); - - raw.dimx = object.base.transform.dim.x; - raw.dimy = object.base.transform.dim.y; - - // Animate - raw.time += time_real_delta() * raw.speed; - raw.lap = math_floor(raw.time / raw.animtime); - raw.lap_time = raw.time - raw.lap * raw.animtime; - raw.count = math_floor(raw.lap_time / raw.spawn_rate); - - particle_sys_update_gpu(raw, object, owner); -} - -function particle_sys_get_data(raw: particle_sys_t): mat4_t { - let hair: bool = raw.r.type == 1; - raw.m.m00 = raw.r.loop ? raw.animtime : -raw.animtime; - raw.m.m01 = hair ? 1 / raw.particles.length : raw.spawn_rate; - raw.m.m02 = hair ? 1 : raw.lifetime; - raw.m.m03 = raw.particles.length; - raw.m.m10 = hair ? 0 : raw.alignx; - raw.m.m11 = hair ? 0 : raw.aligny; - raw.m.m12 = hair ? 0 : raw.alignz; - raw.m.m13 = hair ? 0 : raw.r.factor_random; - raw.m.m20 = hair ? 0 : raw.gx * raw.r.mass; - raw.m.m21 = hair ? 0 : raw.gy * raw.r.mass; - raw.m.m22 = hair ? 0 : raw.gz * raw.r.mass; - raw.m.m23 = hair ? 0 : raw.r.lifetime_random; - raw.m.m30 = 1; // tilesx - raw.m.m31 = 1; // tilesy - raw.m.m32 = 1; // tilesframerate - raw.m.m33 = hair ? 1 : raw.lap_time; - return raw.m; -} - -function particle_sys_update_gpu(raw: particle_sys_t, object: mesh_object_t, owner: mesh_object_t) { - particle_sys_setup_geom(raw, object, owner); - // GPU particles transform is attached to owner object -} - -function particle_sys_rand(max: i32): i32 { - return math_floor(math_random() * max); -} - -function particle_sys_setup_geom(raw: particle_sys_t, object: mesh_object_t, owner: mesh_object_t) { - let instanced_data: f32_array_t = f32_array_create(raw.particles.length * 3); - let i: i32 = 0; - - let norm_fac: f32 = 1 / 32767; // pa.values are not normalized - let scale_pos_owner: f32 = owner.data.scale_pos; - let scale_pos_particle: f32 = object.data.scale_pos; - let particle_size: f32 = raw.r.particle_size; - let scale_fac: vec4_t = vec4_clone(owner.base.transform.scale); - scale_fac = vec4_mult(scale_fac, scale_pos_owner / (particle_size * scale_pos_particle)); - - if (raw.r.emit_from == 0) { // Vert - let pa: vertex_array_t = mesh_data_get_vertex_array(owner.data, "pos"); - let size: i32 = mesh_data_get_vertex_size(pa.data); - - for (let x: i32 = 0; x < raw.particles.length; ++x) { - let j: i32 = math_floor(particle_sys_fhash(i) * (pa.values.length / size)); - instanced_data[i] = pa.values[j * size ] * norm_fac * scale_fac.x; - i++; - instanced_data[i] = pa.values[j * size + 1] * norm_fac * scale_fac.y; - i++; - instanced_data[i] = pa.values[j * size + 2] * norm_fac * scale_fac.z; - i++; - } - } - else if (raw.r.emit_from == 1) { // Face - let positions: i16_array_t = mesh_data_get_vertex_array(owner.data, "pos").values; - - for (let x: i32 = 0; x < raw.particles.length; ++x) { - // Choose random index array (there is one per material) and random face - let ia: u32_array_t = owner.data._.indices[particle_sys_rand(owner.data._.indices.length)]; - let face_index: i32 = particle_sys_rand(math_floor(ia.length / 3)); - - let i0: i32 = ia[face_index * 3 + 0]; - let i1: i32 = ia[face_index * 3 + 1]; - let i2: i32 = ia[face_index * 3 + 2]; - - let v0: vec4_t = vec4_create(positions[i0 * 4], positions[i0 * 4 + 1], positions[i0 * 4 + 2]); - let v1: vec4_t = vec4_create(positions[i1 * 4], positions[i1 * 4 + 1], positions[i1 * 4 + 2]); - let v2: vec4_t = vec4_create(positions[i2 * 4], positions[i2 * 4 + 1], positions[i2 * 4 + 2]); - - let pos: vec4_t = particle_sys_random_point_in_triangle(v0, v1, v2); - - instanced_data[i] = pos.x * norm_fac * scale_fac.x; - i++; - instanced_data[i] = pos.y * norm_fac * scale_fac.y; - i++; - instanced_data[i] = pos.z * norm_fac * scale_fac.z; - i++; - } - } - else if (raw.r.emit_from == 2) { // Volume - let scale_factor_volume: vec4_t = vec4_clone(object.base.transform.dim); - scale_factor_volume = vec4_mult(scale_factor_volume, 0.5 / (particle_size * scale_pos_particle)); - - for (let x: i32 = 0; x < raw.particles.length; ++x) { - instanced_data[i] = (math_random() * 2.0 - 1.0) * scale_factor_volume.x; - i++; - instanced_data[i] = (math_random() * 2.0 - 1.0) * scale_factor_volume.y; - i++; - instanced_data[i] = (math_random() * 2.0 - 1.0) * scale_factor_volume.z; - i++; - } - } -} - -function particle_sys_fhash(n: i32): f32 { - let s: f32 = n + 1.0; - s *= math_fmod(9301.0, s); - s = math_fmod(s * 9301.0 + 49297.0, 233280.0); - return s / 233280.0; -} - -function particle_sys_remove(raw: particle_sys_t) {} - -function particle_sys_random_point_in_triangle(a: vec4_t, b: vec4_t, c: vec4_t): vec4_t { - // Generate a random point in a square where (0, 0) <= (x, y) < (1, 1) - let x: f32 = math_random(); - let y: f32 = math_random(); - - if (x + y > 1) { - // We are in the upper right triangle in the square, mirror to lower left - x = 1 - x; - y = 1 - y; - } - - // Transform the point to the triangle abc - let u: vec4_t = vec4_sub(b, a); - let v: vec4_t = vec4_sub(c, a); - return vec4_add(a, vec4_add(vec4_mult(u, x), vec4_mult(v, y))); -} - -///end diff --git a/armorcore/sources/ts/scene.ts b/armorcore/sources/ts/scene.ts index 78d231d2..70222465 100644 --- a/armorcore/sources/ts/scene.ts +++ b/armorcore/sources/ts/scene.ts @@ -406,15 +406,6 @@ function scene_return_mesh_object(object_file: string, data_ref: string, scene_n ///end let object: mesh_object_t = scene_add_mesh_object(mesh, materials, parent); - // Attach particle systems - ///if arm_particles - if (o.particles != null && o.particles.refs != null) { - for (let i: i32 = 0; i < o.particles.refs.length; ++i) { - let ref: particle_ref_t = o.particles.refs[i]; - mesh_object_setup_particle_system(object, scene_name, ref); - } - } - ///end return scene_return_object(object.base, o); } @@ -495,7 +486,6 @@ type scene_t = { shader_datas?: shader_data_t[]; world_datas?: world_data_t[]; world_ref?: string; - particle_datas?: particle_data_t[]; speaker_datas?: speaker_data_t[]; embedded_datas?: string[]; // Preload for this scene, images only for now }; @@ -707,32 +697,6 @@ type irradiance_t = { irradiance?: f32_array_t; // Blob with spherical harmonics, bands 0,1,2 }; -type particle_data_t = { - name?: string; - type?: i32; // 0 - Emitter, Hair - loop?: bool; - count?: i32; - frame_start?: f32; - frame_end?: f32; - lifetime?: f32; - lifetime_random?: f32; - emit_from?: i32; // 0 - Vert, 1 - Face, 2 - Volume - object_align_factor?: f32_array_t; - factor_random?: f32; - physics_type?: i32; // 0 - No, 1 - Newton - particle_size?: f32; // Object scale - size_random?: f32; // Random scale - mass?: f32; - instance_object?: string; // Object reference - weight_gravity?: f32; -}; - -type particle_ref_t = { - name?: string; - particle?: string; - seed?: i32; -}; - type obj_t = { name?: string; type?: string; // object, mesh_object, light_object, camera_object, speaker_object, decal_object @@ -741,7 +705,6 @@ type obj_t = { dimensions?: f32_array_t; // Geometry objects visible?: bool; spawn?: bool; // Auto add object when creating scene - particles?: particles_t; anim?: anim_t; // Bone/object animation material_refs?: string[]; children?: obj_t[]; @@ -752,12 +715,6 @@ type obj_runtime_t = { _gc?: scene_t; // Link to armpack_decode result }; -type particles_t = { - refs?: particle_ref_t[]; - render_emitter?: bool; - is_particle?: bool; // This object is used as a particle object -}; - type anim_t = { object_actions?: string[]; bone_actions?: string[]; diff --git a/armorcore/sources/ts/uniforms.ts b/armorcore/sources/ts/uniforms.ts index 9dd4a361..4aa7780d 100644 --- a/armorcore/sources/ts/uniforms.ts +++ b/armorcore/sources/ts/uniforms.ts @@ -430,14 +430,6 @@ function uniforms_set_obj_const(obj: object_t, loc: kinc_const_loc_t, c: shader_ // m = mat4_mult_mat(m, camera.prev_p); m = mat4_mult_mat(m, camera.p); } - ///if arm_particles - else if (c.link == "_particle_data") { - let mo: mesh_object_t = obj.ext; - if (mo.particle_owner != null && mo.particle_owner.particle_systems != null) { - m = particle_sys_get_data(mo.particle_owner.particle_systems[mo.particle_index]); - } - } - ///end else if (uniforms_mat4_links != null) { m = uniforms_mat4_links(obj, current_material(obj), c.link); } diff --git a/armorcore/tools/io_export_arm.py b/armorcore/tools/io_export_arm.py index eee4562d..c224f308 100644 --- a/armorcore/tools/io_export_arm.py +++ b/armorcore/tools/io_export_arm.py @@ -80,7 +80,6 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper): self.output["shader_datas"] = None self.output["world_datas"] = None self.output["world_ref"] = None - self.output["particle_datas"] = None self.output["speaker_datas"] = None self.output["embedded_datas"] = None @@ -240,7 +239,6 @@ class ArmoryExporter(bpy.types.Operator, ExportHelper): o["dimensions"] = None o["visible"] = True o["spawn"] = True - o["particles"] = None o["anim"] = None o["material_refs"] = None o["children"] = None diff --git a/armorforge/assets/meshes/box.arm b/armorforge/assets/meshes/box.arm index 0507348e..4058ffc1 100644 Binary files a/armorforge/assets/meshes/box.arm and b/armorforge/assets/meshes/box.arm differ diff --git a/armorforge/assets/meshes/box_bevel.arm b/armorforge/assets/meshes/box_bevel.arm index 0801e52e..67ca2aa0 100644 Binary files a/armorforge/assets/meshes/box_bevel.arm and b/armorforge/assets/meshes/box_bevel.arm differ diff --git a/armorforge/assets/meshes/cone.arm b/armorforge/assets/meshes/cone.arm index dce1154f..ed8f676d 100644 Binary files a/armorforge/assets/meshes/cone.arm and b/armorforge/assets/meshes/cone.arm differ diff --git a/armorforge/assets/meshes/cylinder.arm b/armorforge/assets/meshes/cylinder.arm index c450534f..050b2018 100644 Binary files a/armorforge/assets/meshes/cylinder.arm and b/armorforge/assets/meshes/cylinder.arm differ diff --git a/armorforge/assets/meshes/sphere.arm b/armorforge/assets/meshes/sphere.arm index 87e61e79..fa12ead4 100644 Binary files a/armorforge/assets/meshes/sphere.arm and b/armorforge/assets/meshes/sphere.arm differ diff --git a/armorforge/assets/meshes/torus.arm b/armorforge/assets/meshes/torus.arm index 2008599a..f2e1ee88 100644 Binary files a/armorforge/assets/meshes/torus.arm and b/armorforge/assets/meshes/torus.arm differ diff --git a/armorlab/sources/make_material.ts b/armorlab/sources/make_material.ts index 652c321c..92016db3 100644 --- a/armorlab/sources/make_material.ts +++ b/armorlab/sources/make_material.ts @@ -127,6 +127,3 @@ function make_material_parse_mesh_preview_material(md: material_data_t = null) { function make_material_parse_node_preview_material(node: ui_node_t, group: ui_node_canvas_t = null, parents: ui_node_t[] = null): parse_node_preview_result_t { return null; } - -function make_material_parse_particle_material() { -} diff --git a/armorpaint/assets/meshes/cube_shared_uvs.arm b/armorpaint/assets/meshes/cube_shared_uvs.arm index 42b29b7c..5b72f6d3 100644 Binary files a/armorpaint/assets/meshes/cube_shared_uvs.arm and b/armorpaint/assets/meshes/cube_shared_uvs.arm differ diff --git a/armorpaint/sources/make_material.ts b/armorpaint/sources/make_material.ts index 30ecd964..2566cfa0 100644 --- a/armorpaint/sources/make_material.ts +++ b/armorpaint/sources/make_material.ts @@ -115,30 +115,6 @@ function make_material_parse_mesh_material() { render_path_raytrace_dirty = 1; } -function make_material_parse_particle_material() { - let m: material_data_t = context_raw.particle_material; - let sc: shader_context_t = null; - for (let i: i32 = 0; i < m._.shader._.contexts.length; ++i) { - let c: shader_context_t = m._.shader._.contexts[i]; - if (c.name == "mesh") { - sc = c; - break; - } - } - if (sc != null) { - array_remove(m._.shader.contexts, sc); - array_remove(m._.shader._.contexts, sc); - } - let mm: material_t = { name: "MaterialParticle", canvas: null }; - let con: node_shader_context_t = make_particle_run(mm); - if (sc != null) { - make_material_delete_context(sc); - } - sc = shader_context_create(con.data); - array_push(m._.shader.contexts, sc); - array_push(m._.shader._.contexts, sc); -} - function make_material_parse_mesh_preview_material(md: material_data_t = null) { if (!make_material_get_mout()) { return; diff --git a/armorpaint/sources/make_particle.ts b/armorpaint/sources/make_particle.ts index 83def9d8..c2ce01a8 100644 --- a/armorpaint/sources/make_particle.ts +++ b/armorpaint/sources/make_particle.ts @@ -1,117 +1,23 @@ -function make_particle_run(data: material_t): node_shader_context_t { - let context_id: string = "mesh"; - let props: shader_context_t = { - name: context_id, - depth_write: false, - compare_mode: "always", - cull_mode: "clockwise", - vertex_elements: [ - { - name: "pos", - data: "short4norm" - } - ], - color_attachments: ["R8"] - }; - let con_part: node_shader_context_t = node_shader_context_create(data, props); - - let vert: node_shader_t = node_shader_context_make_vert(con_part); - let frag: node_shader_t = node_shader_context_make_frag(con_part); - frag.ins = vert.outs; - - node_shader_write_attrib(vert, "vec4 spos = vec4(pos.xyz, 1.0);"); - - node_shader_add_uniform(vert, "float brush_radius", "_brush_radius"); - node_shader_write_attrib(vert, "vec3 emit_from = vec3(fhash(gl_InstanceID), fhash(gl_InstanceID * 2), fhash(gl_InstanceID * 3));"); - node_shader_write_attrib(vert, "emit_from = emit_from * brush_radius - brush_radius / 2.0;"); - node_shader_write_attrib(vert, "spos.xyz += emit_from * vec3(256.0, 256.0, 256.0);"); - - node_shader_add_uniform(vert, "mat4 pd", "_particle_data"); - - let str_tex_hash: string = "float fhash(int n) { return fract(sin(float(n)) * 43758.5453); }\n"; - node_shader_add_function(vert, str_tex_hash); - node_shader_add_out(vert, "float p_age"); - node_shader_write(vert, "p_age = pd[3][3] - float(gl_InstanceID) * pd[0][1];"); - node_shader_write(vert, "p_age -= p_age * fhash(gl_InstanceID) * pd[2][3];"); - - node_shader_write(vert, "if (pd[0][0] > 0.0 && p_age < 0.0) p_age += float(int(-p_age / pd[0][0]) + 1) * pd[0][0];"); - - node_shader_add_out(vert, "float p_lifetime"); - node_shader_write(vert, "p_lifetime = pd[0][2];"); - node_shader_write(vert, "if (p_age < 0.0 || p_age > p_lifetime) {"); - // write(vert, "SPIRV_Cross_Output stage_output;"); - // write(vert, "stage_output.svpos /= 0.0;"); - // write(vert, "return stage_output;"); - node_shader_write(vert, "spos /= 0.0;"); - node_shader_write(vert, "}"); - - node_shader_add_out(vert, "vec3 p_velocity"); - node_shader_write(vert, "p_velocity = vec3(pd[1][0], pd[1][1], pd[1][2]);"); - node_shader_write(vert, "p_velocity.x += fhash(gl_InstanceID) * pd[1][3] - pd[1][3] / 2.0;"); - node_shader_write(vert, "p_velocity.y += fhash(gl_InstanceID + int(pd[0][3])) * pd[1][3] - pd[1][3] / 2.0;"); - node_shader_write(vert, "p_velocity.z += fhash(gl_InstanceID + 2 * int(pd[0][3])) * pd[1][3] - pd[1][3] / 2.0;"); - node_shader_write(vert, "p_velocity.x += (pd[2][0] * p_age) / 5.0;"); - node_shader_write(vert, "p_velocity.y += (pd[2][1] * p_age) / 5.0;"); - node_shader_write(vert, "p_velocity.z += (pd[2][2] * p_age) / 5.0;"); - - node_shader_add_out(vert, "vec3 p_location"); - node_shader_write(vert, "p_location = p_velocity * p_age;"); - node_shader_write(vert, "spos.xyz += p_location;"); - node_shader_write(vert, "spos.xyz *= vec3(0.01, 0.01, 0.01);"); - - node_shader_add_uniform(vert, "mat4 WVP", "_world_view_proj_matrix"); - node_shader_write(vert, "gl_Position = mul(spos, WVP);"); - - node_shader_add_uniform(vert, "vec4 inp", "_input_brush"); - node_shader_write(vert, "vec2 binp = vec2(inp.x, 1.0 - inp.y);"); - node_shader_write(vert, "binp = binp * 2.0 - 1.0;"); - node_shader_write(vert, "binp *= gl_Position.w;"); - node_shader_write(vert, "gl_Position.xy += binp;"); - - node_shader_add_out(vert, "float p_fade"); - node_shader_write(vert, "p_fade = sin(min((p_age / 8.0) * 3.141592, 3.141592));"); - - node_shader_add_out(frag, "float frag_color"); - node_shader_write(frag, "frag_color = p_fade;"); - - // add_out(vert, "vec4 wvpposition"); - // write(vert, "wvpposition = gl_Position;"); - // write(frag, "vec2 tex_coord = wvpposition.xy / wvpposition.w;"); - // add_uniform(frag, "sampler2D gbufferD"); - // write(frag, "frag_color *= 1.0 - clamp(distance(textureLod(gbufferD, tex_coord, 0.0).r, wvpposition.z), 0.0, 1.0);"); - - // Material.finalize(con_part); - con_part.data.shader_from_source = true; - con_part.data.vertex_shader = node_shader_get(vert); - con_part.data.fragment_shader = node_shader_get(frag); - - return con_part; -} - function make_particle_mask(vert: node_shader_t, frag: node_shader_t) { ///if arm_physics - if (context_raw.particle_physics) { - node_shader_add_out(vert, "vec4 wpos"); - node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); - node_shader_write_attrib(vert, "wpos = mul(vec4(pos.xyz, 1.0), W);"); - node_shader_add_uniform(frag, "vec3 particle_hit", "_particle_hit"); - node_shader_add_uniform(frag, "vec3 particle_hit_last", "_particle_hit_last"); + node_shader_add_out(vert, "vec4 wpos"); + node_shader_add_uniform(vert, "mat4 W", "_world_matrix"); + node_shader_write_attrib(vert, "wpos = mul(vec4(pos.xyz, 1.0), W);"); + node_shader_add_uniform(frag, "vec3 particle_hit", "_particle_hit"); + node_shader_add_uniform(frag, "vec3 particle_hit_last", "_particle_hit_last"); - node_shader_write(frag, "vec3 pa = wpos.xyz - particle_hit;"); - node_shader_write(frag, "vec3 ba = particle_hit_last - particle_hit;"); - node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); - node_shader_write(frag, "dist = length(pa - ba * h) * 10.0;"); - // write(frag, "dist = distance(particle_hit, wpos.xyz) * 10.0;"); + node_shader_write(frag, "vec3 pa = wpos.xyz - particle_hit;"); + node_shader_write(frag, "vec3 ba = particle_hit_last - particle_hit;"); + node_shader_write(frag, "float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);"); + node_shader_write(frag, "dist = length(pa - ba * h) * 10.0;"); + // write(frag, "dist = distance(particle_hit, wpos.xyz) * 10.0;"); - node_shader_write(frag, "if (dist > 1.0) discard;"); - node_shader_write(frag, "float str = clamp(pow(1.0 / dist * brush_hardness * 0.2, 4.0), 0.0, 1.0) * opacity;"); - node_shader_write(frag, "if (particle_hit.x == 0.0 && particle_hit.y == 0.0 && particle_hit.z == 0.0) str = 0.0;"); - node_shader_write(frag, "if (str == 0.0) discard;"); - return; - } + node_shader_write(frag, "if (dist > 1.0) discard;"); + node_shader_write(frag, "float str = clamp(pow(1.0 / dist * brush_hardness * 0.2, 4.0), 0.0, 1.0) * opacity;"); + node_shader_write(frag, "if (particle_hit.x == 0.0 && particle_hit.y == 0.0 && particle_hit.z == 0.0) str = 0.0;"); + node_shader_write(frag, "if (str == 0.0) discard;"); + ///else + node_shader_write(frag, "float str = 0.0;"); ///end - - node_shader_add_uniform(frag, "sampler2D texparticle", "_texparticle"); - node_shader_write(frag, "float str = textureLod(texparticle, sp.xy, 0.0).r;"); } diff --git a/armorpaint/sources/render_path_paint.ts b/armorpaint/sources/render_path_paint.ts index f58fcdd4..9cb4be57 100644 --- a/armorpaint/sources/render_path_paint.ts +++ b/armorpaint/sources/render_path_paint.ts @@ -114,31 +114,6 @@ function render_path_paint_commands_paint(dilation: bool = true) { let tid: i32 = context_raw.layer.id; if (context_raw.pdirty > 0) { - ///if arm_physics - let particle_physics: bool = context_raw.particle_physics; - ///else - let particle_physics: bool = false; - ///end - if (context_raw.tool == workspace_tool_t.PARTICLE && !particle_physics) { - render_path_set_target("texparticle"); - render_path_clear_target(0x00000000); - render_path_bind_target("_main", "gbufferD"); - if ((context_raw.xray || config_raw.brush_angle_reject) && config_raw.brush_3d) { - render_path_bind_target("gbuffer0", "gbuffer0"); - } - - let mo: mesh_object_t = scene_get_child(".ParticleEmitter").ext; - mo.base.visible = true; - mesh_object_render(mo, "mesh",_render_path_bind_params); - mo.base.visible = false; - - mo = scene_get_child(".Particle").ext; - mo.base.visible = true; - mesh_object_render(mo, "mesh",_render_path_bind_params); - mo.base.visible = false; - render_path_end(); - } - ///if is_sculpt render_path_sculpt_commands(); return; diff --git a/armorpaint/sources/ui_header_ext.ts b/armorpaint/sources/ui_header_ext.ts index bcc87fb7..947075fd 100644 --- a/armorpaint/sources/ui_header_ext.ts +++ b/armorpaint/sources/ui_header_ext.ts @@ -515,20 +515,5 @@ function ui_header_draw_tool_properties(ui: ui_t) { make_material_parse_paint_material(); } } - - ///if arm_physics - if (context_raw.tool == workspace_tool_t.PARTICLE) { - ui._x += 10 * ui_SCALE(ui); - let phys_handle: ui_handle_t = ui_handle(__ID__); - if (phys_handle.init) { - phys_handle.selected = false; - } - context_raw.particle_physics = ui_check(phys_handle, tr("Physics")); - if (phys_handle.changed) { - util_particle_init_physics(); - make_material_parse_paint_material(); - } - } - ///end } } diff --git a/armorsculpt/sources/make_material.ts b/armorsculpt/sources/make_material.ts index 1c320870..5676bbcb 100644 --- a/armorsculpt/sources/make_material.ts +++ b/armorsculpt/sources/make_material.ts @@ -102,30 +102,6 @@ function make_material_parse_mesh_material() { context_raw.ddirty = 2; } -function make_material_parse_particle_material() { - let m: material_data_t = context_raw.particle_material; - let sc: shader_context_t = null; - for (let i: i32 = 0; i < m._.shader._.contexts.length; ++i) { - let c: shader_context_t = m._.shader._.contexts[i]; - if (c.name == "mesh") { - sc = c; - break; - } - } - if (sc != null) { - array_remove(m._.shader.contexts, sc); - array_remove(m._.shader._.contexts, sc); - } - let mt: material_t = { name: "MaterialParticle", canvas: null }; - let con: node_shader_context_t = make_particle_run(mt); - if (sc != null) { - make_material_delete_context(sc); - } - sc = shader_context_create(con.data); - array_push(m._.shader.contexts, sc); - array_push(m._.shader._.contexts, sc); -} - function make_material_parse_mesh_preview_material() { if (!make_material_get_mout()) { return; diff --git a/base/assets/Scene.arm b/base/assets/Scene.arm index b56f84fb..e8638c1c 100644 Binary files a/base/assets/Scene.arm and b/base/assets/Scene.arm differ diff --git a/base/assets/shader_datas.arm b/base/assets/shader_datas.arm index b693ffba..c443b803 100644 Binary files a/base/assets/shader_datas.arm and b/base/assets/shader_datas.arm differ diff --git a/base/project.js b/base/project.js index 8cb13f80..2d1f2e69 100644 --- a/base/project.js +++ b/base/project.js @@ -82,7 +82,6 @@ if (flags.physics) { project.add_define("arm_physics"); } -project.add_define("arm_particles"); // project.add_define("arm_skin"); // project.add_define("arm_audio"); diff --git a/base/sources/context.ts b/base/sources/context.ts index f1070ca0..79f9d77c 100644 --- a/base/sources/context.ts +++ b/base/sources/context.ts @@ -254,7 +254,6 @@ type context_t = { selected_object?: object_t; ///if arm_physics - particle_physics?: bool; particle_hit_x?: f32; particle_hit_y?: f32; particle_hit_z?: f32; @@ -373,7 +372,6 @@ function context_create(): context_t { c.cache_draws = false; c.write_icon_on_export = false; ///if arm_physics - c.particle_physics = false; c.particle_hit_x = 0.0; c.particle_hit_y = 0.0; c.particle_hit_z = 0.0; @@ -584,7 +582,6 @@ function context_init_tool() { else if (context_raw.tool == workspace_tool_t.PARTICLE) { util_particle_init(); - make_material_parse_particle_material(); } else if (context_raw.tool == workspace_tool_t.BAKE) { // Bake in lit mode for now diff --git a/base/sources/ui_base.ts b/base/sources/ui_base.ts index ea490452..f433de28 100644 --- a/base/sources/ui_base.ts +++ b/base/sources/ui_base.ts @@ -707,7 +707,7 @@ function ui_base_update() { } ///if arm_physics - if (context_raw.tool == workspace_tool_t.PARTICLE && context_raw.particle_physics && context_in_paint_area() && !context_raw.paint2d) { + if (context_raw.tool == workspace_tool_t.PARTICLE && context_in_paint_area() && !context_raw.paint2d) { util_particle_init_physics(); let world: physics_world_t = physics_world_active; physics_world_update(world); @@ -985,7 +985,7 @@ function ui_base_update_ui() { } ///if arm_physics - if (context_raw.tool == workspace_tool_t.PARTICLE && context_raw.particle_physics) { + if (context_raw.tool == workspace_tool_t.PARTICLE) { down = false; } ///end @@ -1038,16 +1038,6 @@ function ui_base_update_ui() { context_raw.clone_delta_y = (context_raw.clone_start_y - my) / app_h(); context_raw.clone_start_x = -1; } - else if (context_raw.tool == workspace_tool_t.PARTICLE) { - // Reset particles - ///if arm_particles - let emitter: mesh_object_t = scene_get_child(".ParticleEmitter").ext; - let psys: particle_sys_t = emitter.particle_systems[0]; - psys.time = 0; - // psys.time = psys.seed * psys.animtime; - // psys.seed++; - ///end - } else if (context_raw.tool == workspace_tool_t.FILL && context_raw.fill_type_handle.position == fill_type_t.UV_ISLAND) { util_uv_uvislandmap_cached = false; } diff --git a/base/sources/util_clone.ts b/base/sources/util_clone.ts index 7708b0e5..5aaa2112 100644 --- a/base/sources/util_clone.ts +++ b/base/sources/util_clone.ts @@ -293,32 +293,6 @@ function util_clone_material_data(m: material_data_t): material_data_t { return r; } -function util_clone_particle_refs(parts: particle_ref_t[]): particle_ref_t[] { - if (parts == null) { - return null; - } - let r: particle_ref_t[] = []; - for (let i: i32 = 0; i < parts.length; ++i) { - let p: particle_ref_t = {}; - p.name = parts[i].name; - p.particle = parts[i].particle; - p.seed = parts[i].seed; - array_push(r, p); - } - return r; -} - -function util_clone_particles(p: particles_t): particles_t { - if (p == null) { - return null; - } - let r: particles_t = {}; - r.refs = util_clone_particle_refs(p.refs); - r.render_emitter = p.render_emitter; - r.is_particle = p.is_particle; - return r; -} - function util_clone_tracks(tracks: track_t[]): track_t[] { if (tracks == null) { return null; @@ -366,7 +340,6 @@ function util_clone_obj(o: obj_t): obj_t { r.dimensions = util_clone_f32_array(o.dimensions); r.visible = o.visible; r.spawn = o.spawn; - r.particles = util_clone_particles(o.particles); r.anim = util_clone_anim(o.anim); r.material_refs = util_clone_string_array(o.material_refs); if (o.children != null) { diff --git a/base/sources/util_encode.ts b/base/sources/util_encode.ts index 651b3f07..17a76fbf 100644 --- a/base/sources/util_encode.ts +++ b/base/sources/util_encode.ts @@ -24,8 +24,6 @@ function util_encode_scene(raw: scene_t): buffer_t { armpack_encode_null(); armpack_encode_string("world_ref"); armpack_encode_null(); - armpack_encode_string("particle_datas"); - armpack_encode_null(); armpack_encode_string("speaker_datas"); armpack_encode_null(); armpack_encode_string("embedded_datas"); diff --git a/base/sources/util_particle.ts b/base/sources/util_particle.ts index 18fe934b..551633f3 100644 --- a/base/sources/util_particle.ts +++ b/base/sources/util_particle.ts @@ -4,34 +4,6 @@ function util_particle_init() { return; } - let raw: particle_data_t = { - name: "Particles", - type: 0, - loop: false, - count: 1000, - frame_start: 0, - frame_end: 1000, - lifetime: 400, - lifetime_random: 0.5, - emit_from: 1, - object_align_factor: f32_array_create_xyz(0, 0, -40), - factor_random: 2.0, - physics_type: 0, - particle_size: 1.0, - size_random: 0, - mass: 1, - instance_object: ".Particle", - weight_gravity: 1 - }; - _scene_raw.particle_datas = [raw]; - let particle_refs: particle_ref_t[] = [ - { - name: "Particles", - particle: "Particles", - seed: 0 - } - ]; - { let t: render_target_t = render_target_create(); t.name = "texparticle"; @@ -60,10 +32,6 @@ function util_particle_init() { if (obj.name == ".Sphere") { let particle: obj_t = util_clone_obj(obj); particle.name = ".Particle"; - if (particle.particles == null) { - particle.particles = {}; - } - particle.particles.is_particle = true; particle.material_refs = ["MaterialParticle"]; array_push(_scene_raw.objects, particle); for (let i: i32 = 0; i < 16; ++i) { @@ -77,12 +45,6 @@ function util_particle_init() { let mo: mesh_object_t = o.ext; mo.base.name = ".ParticleEmitter"; mo.base.raw = util_clone_obj(mo.base.raw); - let oraw: obj_t = mo.base.raw; - oraw.particles = {}; - mo.base.raw.particles.refs = particle_refs; - ///if arm_particles - mesh_object_setup_particle_system(mo, "Scene", particle_refs[0]); - ///end } ///if arm_physics