From eeab144abb311ffba7274cf5450e588d9381e066 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Tue, 11 Feb 2025 14:11:04 +0100 Subject: [PATCH] Always use particle physics --- armorcore/sources/ts/data.ts | 14 -- armorcore/sources/ts/mesh_object.ts | 76 +----- armorcore/sources/ts/particle_data.ts | 21 -- armorcore/sources/ts/particle_sys.ts | 250 ------------------- armorcore/sources/ts/scene.ts | 43 ---- armorcore/sources/ts/uniforms.ts | 8 - armorcore/tools/io_export_arm.py | 2 - armorforge/assets/meshes/box.arm | Bin 1386 -> 1351 bytes armorforge/assets/meshes/box_bevel.arm | Bin 19818 -> 19783 bytes armorforge/assets/meshes/cone.arm | Bin 6469 -> 6434 bytes armorforge/assets/meshes/cylinder.arm | Bin 10041 -> 10006 bytes armorforge/assets/meshes/sphere.arm | Bin 177507 -> 177472 bytes armorforge/assets/meshes/torus.arm | Bin 203616 -> 203581 bytes armorlab/sources/make_material.ts | 3 - armorpaint/assets/meshes/cube_shared_uvs.arm | Bin 1299 -> 1279 bytes armorpaint/sources/make_material.ts | 24 -- armorpaint/sources/make_particle.ts | 126 ++-------- armorpaint/sources/render_path_paint.ts | 25 -- armorpaint/sources/ui_header_ext.ts | 15 -- armorsculpt/sources/make_material.ts | 24 -- base/assets/Scene.arm | Bin 179086 -> 178826 bytes base/assets/shader_datas.arm | Bin 23842 -> 23822 bytes base/project.js | 1 - base/sources/context.ts | 3 - base/sources/ui_base.ts | 14 +- base/sources/util_clone.ts | 27 -- base/sources/util_encode.ts | 2 - base/sources/util_particle.ts | 38 --- 28 files changed, 19 insertions(+), 697 deletions(-) delete mode 100644 armorcore/sources/ts/particle_data.ts delete mode 100644 armorcore/sources/ts/particle_sys.ts 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 0507348ecdc165529f4f7654b138e1a03dabf15a..4058ffc1711c8d3c9f0e08f63f559c748c63e071 100644 GIT binary patch delta 24 gcmaFGb)1XoKF>rZ4Mwhs+7~u+F@9m5EW{cC0B0fxyZ`_I delta 51 ycmX@k^@@w>KJP>(4My&X+86jZ85kG}5{pVQlXFsw4{ZGPm6?YRNoewOmIMH?ClQnY diff --git a/armorforge/assets/meshes/box_bevel.arm b/armorforge/assets/meshes/box_bevel.arm index 0801e52eaa7434f9fda13fceab35b8a270692adc..67ca2aa03cd0a53c2e374003b3468d6670770abc 100644 GIT binary patch delta 26 icmaDgi}Cm@MyC5b6PYv^xh85~*v!TF#e1@lZv+5_atUq# delta 53 zcmX>;i}BSgMyC6`6PYv^xhHC0;NxUqU?@l|D#=XFNi9CG@z+;x9zGO( AMgRZ+ diff --git a/armorforge/assets/meshes/cone.arm b/armorforge/assets/meshes/cone.arm index dce1154fa95c040ba75845594aac697188af28f5..ed8f676d6f603f47028861a82544140c5e11be74 100644 GIT binary patch delta 24 gcmX?Vw8)6*KF>rZ4Mwhs+Lt!-FrF2k{8l0Y0BNxZp#T5? delta 51 ycmZ2vbkvCHKJP>(4My&X+L!n^85kG}5{pVQlXFsw4{ZE%PMn7iNoevRi39+!u@QOz diff --git a/armorforge/assets/meshes/cylinder.arm b/armorforge/assets/meshes/cylinder.arm index c450534f0c567263853b9472bd304e8514d89041..050b2018df9b6d65f6ba3857aa7707f3d9394d34 100644 GIT binary patch delta 24 gcmdn#H_eafKF>rZ4Mwhs+P5}~Fz!^H{7@|d0Bo-a%>V!Z delta 52 zcmbQ{x6_a5KJP>(4My&X+PC;P85kG}5{pVQlXFsw4{T;(+@;FHha@(6n_2<@uEP+i diff --git a/armorforge/assets/meshes/sphere.arm b/armorforge/assets/meshes/sphere.arm index 87e61e79889ca7cca609d9b64fc56ffd3927d0cb..fa12ead4fa8c631dde148c0c3104c0be34766c0c 100644 GIT binary patch delta 39 vcmaF-itE5DE~fiD6PYv^xh4lNN=$U#*DS!;F2KmRU4W74`R3`|TbUvN8o&(? delta 64 zcmX@`itF(!E~fju6PYv^xhFd^N=$U#$H&RQz)+A_RFavTlUjVBiLs55aT_Dki_JWI MND|W@Y+*_O0Kc>qxBvhE diff --git a/armorforge/assets/meshes/torus.arm b/armorforge/assets/meshes/torus.arm index 2008599a9051e9a618203931b8659c3945b1a6c2..f2e1ee88dbf7e9c1f02284bad288faa1627ea42f 100644 GIT binary patch delta 43 xcmaE`jc4yR9;W*|6PYv^xhDHDicfUf+swz<&c_JCOxyVwnV(5c=a6QO001ym3;X~8 delta 67 zcmdnHjpxBO9;W-e6PYv^xhLB*icfUf%g4#Uz)+A_RFavTlUjVB@n7pd#@2sKTmLaX Pm*n9?lAC^4ia7xQG(H%N 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 42b29b7c4bc69871977d42f357f1033e75d3e7e6..5b72f6d31702ade78f5508b7001bf6b6734e4e53 100644 GIT binary patch delta 15 XcmbQt^`DdJKF>y`>nxMsvZw(7FT@4Q delta 34 qcmey*Ihl*;KJP}R>nuWi3=9kfiA5!u$vLU 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 b56f84fbad44fbb43c08631c6da311d71917f948..e8638c1c2f8d8e1a8cce631a3d9ef24327d498c2 100644 GIT binary patch delta 264 zcmeDC&eipmi|IbkL?#VJu8G>WCSPJxoNUS{$;dU?pYa-)7s@0Hdz}Vmh&6y2fs%Gyo^kRk{EG delta 511 zcmeDB%GLLsi|Ib^L?#VJ?upvB_&6CD7zz@LN-~pkQi~5vPGD7kWw9=8fRHAacae*F8;RY0tm>?wdAQq2m2?Fxd7+Z6