From 1c20e03e0c119fb2bc848eef284a99c635bab149 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sat, 31 May 2025 06:07:19 +0000 Subject: [PATCH 01/92] Update leenkx/blender/lnx/material/cycles_nodes/nodes_converter.py --- .../material/cycles_nodes/nodes_converter.py | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/leenkx/blender/lnx/material/cycles_nodes/nodes_converter.py b/leenkx/blender/lnx/material/cycles_nodes/nodes_converter.py index 49cb1311..5df58ec6 100644 --- a/leenkx/blender/lnx/material/cycles_nodes/nodes_converter.py +++ b/leenkx/blender/lnx/material/cycles_nodes/nodes_converter.py @@ -82,28 +82,37 @@ def parse_clamp(node: bpy.types.ShaderNodeClamp, out_socket: bpy.types.NodeSocke def parse_valtorgb(node: bpy.types.ShaderNodeValToRGB, out_socket: bpy.types.NodeSocket, state: ParserState) -> Union[floatstr, vec3str]: - # Alpha (TODO: make ColorRamp calculation vec4-based and split afterwards) - if out_socket == node.outputs[1]: - return '1.0' input_fac: bpy.types.NodeSocket = node.inputs[0] - + alpha_out = out_socket == node.outputs[1] fac: str = c.parse_value_input(input_fac) if input_fac.is_linked else c.to_vec1(input_fac.default_value) interp = node.color_ramp.interpolation elems = node.color_ramp.elements - + if len(elems) == 1: - return c.to_vec3(elems[0].color) - - # Write color array - # The last entry is included twice so that the interpolation - # between indices works (no out of bounds error) - cols_var = c.node_name(node.name).upper() + '_COLS' + if alpha_out: + return c.to_vec1(elems[0].color[3]) # Return alpha from the color + else: + return c.to_vec3(elems[0].color) # Return RGB + + name_prefix = c.node_name(node.name).upper() + + if alpha_out: + cols_var = name_prefix + '_ALPHAS' + else: + cols_var = name_prefix + '_COLS' if state.current_pass == ParserPass.REGULAR: - cols_entries = ', '.join(f'vec3({elem.color[0]}, {elem.color[1]}, {elem.color[2]})' for elem in elems) - cols_entries += f', vec3({elems[len(elems) - 1].color[0]}, {elems[len(elems) - 1].color[1]}, {elems[len(elems) - 1].color[2]})' - state.curshader.add_const("vec3", cols_var, cols_entries, array_size=len(elems) + 1) + if alpha_out: + cols_entries = ', '.join(f'{elem.color[3]}' for elem in elems) + # Add last value twice to avoid out of bounds access + cols_entries += f', {elems[len(elems) - 1].color[3]}' + state.curshader.add_const("float", cols_var, cols_entries, array_size=len(elems) + 1) + else: + # Create array of RGB values for color output + cols_entries = ', '.join(f'vec3({elem.color[0]}, {elem.color[1]}, {elem.color[2]})' for elem in elems) + cols_entries += f', vec3({elems[len(elems) - 1].color[0]}, {elems[len(elems) - 1].color[1]}, {elems[len(elems) - 1].color[2]})' + state.curshader.add_const("vec3", cols_var, cols_entries, array_size=len(elems) + 1) fac_var = c.node_name(node.name) + '_fac' + state.get_parser_pass_suffix() state.curshader.write(f'float {fac_var} = {fac};') @@ -121,21 +130,22 @@ def parse_valtorgb(node: bpy.types.ShaderNodeValToRGB, out_socket: bpy.types.Nod # Linear interpolation else: - # Write factor array - facs_var = c.node_name(node.name).upper() + '_FACS' + # Write factor array - same for both color and alpha + facs_var = name_prefix + '_FACS' if state.current_pass == ParserPass.REGULAR: facs_entries = ', '.join(str(elem.position) for elem in elems) - # Add one more entry at the rightmost position so that the - # interpolation between indices works (no out of bounds error) + # Add one more entry at the rightmost position to avoid out of bounds access facs_entries += ', 1.0' state.curshader.add_const("float", facs_var, facs_entries, array_size=len(elems) + 1) - # Mix color + # Calculation for interpolation position prev_stop_fac = f'{facs_var}[{index_var}]' next_stop_fac = f'{facs_var}[{index_var} + 1]' prev_stop_col = f'{cols_var}[{index_var}]' next_stop_col = f'{cols_var}[{index_var} + 1]' rel_pos = f'({fac_var} - {prev_stop_fac}) * (1.0 / ({next_stop_fac} - {prev_stop_fac}))' + + # Use mix function for both alpha and color outputs (mix works on floats too) return f'mix({prev_stop_col}, {next_stop_col}, max({rel_pos}, 0.0))' if bpy.app.version > (3, 2, 0): From 9824dc5a44e5f78c78f7bfec90b98da750c88baf Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 20:52:08 +0000 Subject: [PATCH 02/92] moisesjpelaez - General Fixes --- leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx b/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx index b0235095..74fd9ce4 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx @@ -153,6 +153,7 @@ class RigidBody extends iron.Trait { if (!Std.isOfType(object, MeshObject)) return; // No mesh data transform = object.transform; + transform.buildMatrix(); physics = leenkx.trait.physics.PhysicsWorld.active; if (shape == Shape.Box) { From 2e77f676830b804827ff3e9e846d7b8f6cc057d3 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 21:51:09 +0000 Subject: [PATCH 03/92] moisesjpelaez - Physics Improvements --- leenkx/Sources/iron/object/ParticleSystem.hx | 133 ++++++++++++------- 1 file changed, 86 insertions(+), 47 deletions(-) diff --git a/leenkx/Sources/iron/object/ParticleSystem.hx b/leenkx/Sources/iron/object/ParticleSystem.hx index 5c94f08e..ca9fef5a 100644 --- a/leenkx/Sources/iron/object/ParticleSystem.hx +++ b/leenkx/Sources/iron/object/ParticleSystem.hx @@ -2,6 +2,7 @@ package iron.object; #if lnx_particles +import kha.FastFloat; import kha.graphics4.Usage; import kha.arrays.Float32Array; import iron.data.Data; @@ -16,39 +17,45 @@ import iron.math.Vec4; class ParticleSystem { public var data: ParticleData; public var speed = 1.0; + var currentSpeed = 0.0; var particles: Array; var ready: Bool; - public var frameRate = 24; - public var lifetime = 0.0; - public var animtime = 0.0; - public var time = 0.0; - public var spawnRate = 0.0; + var frameRate = 24; + var lifetime = 0.0; + var animtime = 0.0; + var time = 0.0; + var spawnRate = 0.0; + var looptime = 0.0; var seed = 0; - public var r: TParticleData; - public var gx: Float; - public var gy: Float; - public var gz: Float; - public var alignx: Float; - public var aligny: Float; - public var alignz: Float; + var r: TParticleData; + var gx: Float; + var gy: Float; + var gz: Float; + var alignx: Float; + var aligny: Float; + var alignz: Float; var dimx: Float; var dimy: Float; var tilesx: Int; var tilesy: Int; var tilesFramerate: Int; - public var count = 0; - public var lap = 0; - public var lapTime = 0.0; + var count = 0; + var lap = 0; + var lapTime = 0.0; var m = Mat4.identity(); var ownerLoc = new Vec4(); var ownerRot = new Quat(); var ownerScl = new Vec4(); + + var random = 0.0; public function new(sceneName: String, pref: TParticleReference) { seed = pref.seed; + currentSpeed = speed; + speed = 0; particles = []; ready = false; @@ -65,34 +72,61 @@ class ParticleSystem { gy = 0; gz = -9.81 * r.weight_gravity; } - alignx = r.object_align_factor[0] / 2; - aligny = r.object_align_factor[1] / 2; - alignz = r.object_align_factor[2] / 2; + alignx = r.object_align_factor[0]; + aligny = r.object_align_factor[1]; + alignz = r.object_align_factor[2]; + looptime = (r.frame_end - r.frame_start) / frameRate; lifetime = r.lifetime / frameRate; - animtime = (r.frame_end - r.frame_start) / frameRate; + animtime = r.loop ? looptime : looptime + lifetime; spawnRate = ((r.frame_end - r.frame_start) / r.count) / frameRate; for (i in 0...r.count) { - var particle = new Particle(i); - particle.sr = 1 - Math.random() * r.size_random; - particles.push(particle); + particles.push(new Particle(i)); } ready = true; + if (r.auto_start){ + start(); + } }); } + public function start() { + if (r.is_unique) random = Math.random(); + lifetime = r.lifetime / frameRate; + time = 0; + lap = 0; + lapTime = 0; + speed = currentSpeed; + } + public function pause() { - lifetime = 0; + speed = 0; } public function resume() { lifetime = r.lifetime / frameRate; + speed = currentSpeed; } + + + // TODO: interrupt smoothly + public function stop() { + end(); + } + + function end() { + lifetime = 0; + speed = 0; + lap = 0; + } + public function update(object: MeshObject, owner: MeshObject) { if (!ready || object == null || speed == 0.0) return; + var prevLap = lap; + // Copy owner world transform but discard scale owner.transform.world.decompose(ownerLoc, ownerRot, ownerScl); object.transform.loc = ownerLoc; @@ -115,17 +149,21 @@ class ParticleSystem { } // Animate - time += Time.delta * speed; + time += Time.renderDelta * speed; lap = Std.int(time / animtime); lapTime = time - lap * animtime; count = Std.int(lapTime / spawnRate); + if (lap > prevLap && !r.loop) { + end(); + } + updateGpu(object, owner); } public function getData(): Mat4 { var hair = r.type == 1; - m._00 = r.loop ? animtime : -animtime; + m._00 = animtime; m._01 = hair ? 1 / particles.length : spawnRate; m._02 = hair ? 1 : lifetime; m._03 = particles.length; @@ -133,9 +171,9 @@ class ParticleSystem { m._11 = hair ? 0 : aligny; m._12 = hair ? 0 : alignz; m._13 = hair ? 0 : r.factor_random; - m._20 = hair ? 0 : gx * r.mass; - m._21 = hair ? 0 : gy * r.mass; - m._22 = hair ? 0 : gz * r.mass; + m._20 = hair ? 0 : gx; + m._21 = hair ? 0 : gy; + m._22 = hair ? 0 : gz; m._23 = hair ? 0 : r.lifetime_random; m._30 = tilesx; m._31 = tilesy; @@ -144,13 +182,25 @@ class ParticleSystem { return m; } + public function getSizeRandom(): FastFloat { + return r.size_random; + } + + public function getRandom(): FastFloat { + return random; + } + + public function getSize(): FastFloat { + return r.particle_size; + } + function updateGpu(object: MeshObject, owner: MeshObject) { if (!object.data.geom.instanced) setupGeomGpu(object, owner); // GPU particles transform is attached to owner object } - public function setupGeomGpu(object: MeshObject, owner: MeshObject) { - var instancedData = new Float32Array(particles.length * 6); + function setupGeomGpu(object: MeshObject, owner: MeshObject) { + var instancedData = new Float32Array(particles.length * 3); var i = 0; var normFactor = 1 / 32767; // pa.values are not normalized @@ -169,10 +219,6 @@ class ParticleSystem { instancedData.set(i, pa.values[j * pa.size ] * normFactor * scaleFactor.x); i++; instancedData.set(i, pa.values[j * pa.size + 1] * normFactor * scaleFactor.y); i++; instancedData.set(i, pa.values[j * pa.size + 2] * normFactor * scaleFactor.z); i++; - - instancedData.set(i, p.sr); i++; - instancedData.set(i, p.sr); i++; - instancedData.set(i, p.sr); i++; } case 1: // Face @@ -196,10 +242,6 @@ class ParticleSystem { instancedData.set(i, pos.x * normFactor * scaleFactor.x); i++; instancedData.set(i, pos.y * normFactor * scaleFactor.y); i++; instancedData.set(i, pos.z * normFactor * scaleFactor.z); i++; - - instancedData.set(i, p.sr); i++; - instancedData.set(i, p.sr); i++; - instancedData.set(i, p.sr); i++; } case 2: // Volume @@ -210,13 +252,9 @@ class ParticleSystem { instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.x); i++; instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.y); i++; instancedData.set(i, (Math.random() * 2.0 - 1.0) * scaleFactorVolume.z); i++; - - instancedData.set(i, p.sr); i++; - instancedData.set(i, p.sr); i++; - instancedData.set(i, p.sr); i++; } } - object.data.geom.setupInstanced(instancedData, 3, Usage.StaticUsage); + object.data.geom.setupInstanced(instancedData, 1, Usage.StaticUsage); } function fhash(n: Int): Float { @@ -255,10 +293,11 @@ class ParticleSystem { class Particle { public var i: Int; - public var px = 0.0; - public var py = 0.0; - public var pz = 0.0; - public var sr = 1.0; // Size random + + public var x = 0.0; + public var y = 0.0; + public var z = 0.0; + public var cameraDistance: Float; public function new(i: Int) { From 16e019be263bac9f9e5cca1601d24167a7999101 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 21:53:31 +0000 Subject: [PATCH 04/92] moisesjpelaez - Physics Improvements --- leenkx/Sources/iron/data/SceneFormat.hx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leenkx/Sources/iron/data/SceneFormat.hx b/leenkx/Sources/iron/data/SceneFormat.hx index ff88e8e4..a499d3fa 100644 --- a/leenkx/Sources/iron/data/SceneFormat.hx +++ b/leenkx/Sources/iron/data/SceneFormat.hx @@ -392,6 +392,8 @@ typedef TParticleData = { #end public var name: String; public var type: Int; // 0 - Emitter, Hair + public var auto_start: Bool; + public var is_unique: Bool; public var loop: Bool; public var count: Int; public var frame_start: FastFloat; From d40d3eb96e93209f8864c0c7c0d4826d60a23e3c Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 21:56:06 +0000 Subject: [PATCH 05/92] moisesjpelaez - Physics Improvements --- leenkx/Sources/iron/object/Uniforms.hx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/leenkx/Sources/iron/object/Uniforms.hx b/leenkx/Sources/iron/object/Uniforms.hx index 022a777e..473958d3 100644 --- a/leenkx/Sources/iron/object/Uniforms.hx +++ b/leenkx/Sources/iron/object/Uniforms.hx @@ -1109,6 +1109,26 @@ class Uniforms { case "_texUnpack": { f = texUnpack != null ? texUnpack : 1.0; } + #if lnx_particles + case "_particleSizeRandom": { + var mo = cast(object, MeshObject); + if (mo.particleOwner != null && mo.particleOwner.particleSystems != null) { + f = mo.particleOwner.particleSystems[mo.particleIndex].getSizeRandom(); + } + } + case "_particleRandom": { + var mo = cast(object, MeshObject); + if (mo.particleOwner != null && mo.particleOwner.particleSystems != null) { + f = mo.particleOwner.particleSystems[mo.particleIndex].getRandom(); + } + } + case "_particleSize": { + var mo = cast(object, MeshObject); + if (mo.particleOwner != null && mo.particleOwner.particleSystems != null) { + f = mo.particleOwner.particleSystems[mo.particleIndex].getSize(); + } + } + #end } if (f == null && externalFloatLinks != null) { From fa913484285eaa505d6086c775ecaba3c118f382 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 21:58:58 +0000 Subject: [PATCH 06/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/exporter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leenkx/blender/lnx/exporter.py b/leenkx/blender/lnx/exporter.py index ffb2434f..c1b5f3d9 100644 --- a/leenkx/blender/lnx/exporter.py +++ b/leenkx/blender/lnx/exporter.py @@ -2297,6 +2297,8 @@ class LeenkxExporter: out_particlesys = { 'name': particleRef[1]["structName"], 'type': 0 if psettings.type == 'EMITTER' else 1, # HAIR + 'auto_start': psettings.lnx_auto_start, + 'is_unique': psettings.lnx_is_unique, 'loop': psettings.lnx_loop, # Emission 'count': int(psettings.count * psettings.lnx_count_mult), From 3413e10134e9d36c1fe4dc50d1c4f7720871dcce Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:11:11 +0000 Subject: [PATCH 07/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/material/make_particle.py | 189 ++++++++++++++++++- 1 file changed, 179 insertions(+), 10 deletions(-) diff --git a/leenkx/blender/lnx/material/make_particle.py b/leenkx/blender/lnx/material/make_particle.py index d22e534f..8001dbfb 100644 --- a/leenkx/blender/lnx/material/make_particle.py +++ b/leenkx/blender/lnx/material/make_particle.py @@ -1,3 +1,4 @@ +import bpy import lnx.utils import lnx.material.mat_state as mat_state @@ -10,6 +11,48 @@ else: def write(vert, particle_info=None, shadowmap=False): + ramp_el_len = 0 + + ramp_positions = [] + ramp_colors_b = [] + size_over_time_factor = 0 + + use_rotations = False + rotation_mode = 'NONE' + rotation_factor_random = 0 + phase_factor = 0 + phase_factor_random = 0 + + for obj in bpy.data.objects: + for psys in obj.particle_systems: + psettings = psys.settings + + if psettings.instance_object: + if psettings.instance_object.active_material: + # FIXME: Different particle systems may share the same particle object. This ideally should check the correct `ParticleSystem` using an id or name in the particle's object material. + if psettings.instance_object.active_material.name.replace(".", "_") == vert.context.matname: + # Rotation data + use_rotations = psettings.use_rotations + rotation_mode = psettings.rotation_mode + rotation_factor_random = psettings.rotation_factor_random + phase_factor = psettings.phase_factor + phase_factor_random = psettings.phase_factor_random + + # Texture slots data + if psettings.texture_slots and len(psettings.texture_slots.items()) != 0: + for tex_slot in psettings.texture_slots: + if not tex_slot: break + if not tex_slot.use_map_size: break # TODO: check also for other influences + if tex_slot.texture and tex_slot.texture.use_color_ramp: + if tex_slot.texture.color_ramp and tex_slot.texture.color_ramp.elements: + ramp_el_len = len(tex_slot.texture.color_ramp.elements.items()) + for element in tex_slot.texture.color_ramp.elements: + ramp_positions.append(element.position) + ramp_colors_b.append(element.color[2]) + size_over_time_factor = tex_slot.size_factor + break + + # Outs out_index = True if particle_info != None and particle_info['index'] else False out_age = True if particle_info != None and particle_info['age'] else False @@ -19,19 +62,50 @@ def write(vert, particle_info=None, shadowmap=False): out_velocity = True if particle_info != None and particle_info['velocity'] else False out_angular_velocity = True if particle_info != None and particle_info['angular_velocity'] else False + # Force Leenkx to create a new shader per material ID + vert.write(f'#ifdef PARTICLE_ID_{vert.context.material.lnx_material_id}') + vert.write('#endif') + vert.add_uniform('mat4 pd', '_particleData') + vert.add_uniform('float pd_size_random', '_particleSizeRandom') + vert.add_uniform('float pd_random', '_particleRandom') + vert.add_uniform('float pd_size', '_particleSize') + + if ramp_el_len != 0: + vert.add_const('float', 'P_SIZE_OVER_TIME_FACTOR', str(size_over_time_factor)) + for i in range(ramp_el_len): + vert.add_const('float', f'P_RAMP_POSITION_{i}', str(ramp_positions[i])) + vert.add_const('float', f'P_RAMP_COLOR_B_{i}', str(ramp_colors_b[i])) str_tex_hash = "float fhash(float n) { return fract(sin(n) * 43758.5453); }\n" vert.add_function(str_tex_hash) + + if (ramp_el_len != 0): + str_ramp_scale = "float get_ramp_scale(float age) {\n" + + for i in range(ramp_el_len): + if i == 0: + str_ramp_scale += f"if (age <= P_RAMP_POSITION_{i + 1})" + elif i == ramp_el_len - 1: + str_ramp_scale += f"return P_RAMP_COLOR_B_{ramp_el_len - 1};" + break + else: + str_ramp_scale += f"else if (age <= P_RAMP_POSITION_{i + 1})" + str_ramp_scale += f""" {{ + float t = (age - P_RAMP_POSITION_{i}) / (P_RAMP_POSITION_{i + 1} - P_RAMP_POSITION_{i}); + return mix(P_RAMP_COLOR_B_{i}, P_RAMP_COLOR_B_{i + 1}, t); + }} + """ + str_ramp_scale += "}\n" + vert.add_function(str_ramp_scale) + prep = 'float ' if out_age: prep = '' vert.add_out('float p_age') # var p_age = lapTime - p.i * spawnRate vert.write(prep + 'p_age = pd[3][3] - gl_InstanceID * pd[0][1];') - # p_age -= p_age * fhash(i) * r.lifetime_random; - vert.write('p_age -= p_age * fhash(gl_InstanceID) * pd[2][3];') # Loop # pd[0][0] - animtime, loop stored in sign @@ -43,13 +117,18 @@ def write(vert, particle_info=None, shadowmap=False): if out_lifetime: prep = '' vert.add_out('float p_lifetime') - vert.write(prep + 'p_lifetime = pd[0][2];') + vert.write(prep + 'p_lifetime = pd[0][2] * (1 - (fhash(gl_InstanceID + 4 * pd[0][3] + pd_random) * pd[2][3]));') # clip with nan vert.write('if (p_age < 0 || p_age > p_lifetime) {') vert.write(' gl_Position /= 0.0;') vert.write(' return;') vert.write('}') + if (ramp_el_len != 0): + vert.write('float n_age = clamp(p_age / p_lifetime, 0.0, 1.0);') + vert.write(f'spos.xyz *= 1 + (get_ramp_scale(n_age) - 1) * {size_over_time_factor};') + vert.write('spos.xyz *= 1 - (fhash(gl_InstanceID + 3 * pd[0][3] + pd_random) * pd_size_random);') + # vert.write('p_age /= 2;') # Match # object_align_factor / 2 + gxyz @@ -57,20 +136,20 @@ def write(vert, particle_info=None, shadowmap=False): if out_velocity: prep = '' vert.add_out('vec3 p_velocity') - vert.write(prep + 'p_velocity = vec3(pd[1][0], pd[1][1], pd[1][2]);') + vert.write(prep + 'p_velocity = vec3(pd[1][0] * (1 / pd_size), pd[1][1] * (1 / pd_size), pd[1][2] * (1 / pd_size));') - vert.write('p_velocity.x += fhash(gl_InstanceID) * pd[1][3] - pd[1][3] / 2;') - vert.write('p_velocity.y += fhash(gl_InstanceID + pd[0][3]) * pd[1][3] - pd[1][3] / 2;') - vert.write('p_velocity.z += fhash(gl_InstanceID + 2 * pd[0][3]) * pd[1][3] - pd[1][3] / 2;') + vert.write('p_velocity.x += (fhash(gl_InstanceID + pd_random) * 2.0 / pd_size - 1.0 / pd_size) * pd[1][3];') + vert.write('p_velocity.y += (fhash(gl_InstanceID + pd_random + pd[0][3]) * 2.0 / pd_size - 1.0 / pd_size) * pd[1][3];') + vert.write('p_velocity.z += (fhash(gl_InstanceID + pd_random + 2 * pd[0][3]) * 2.0 / pd_size - 1.0 / pd_size) * pd[1][3];') # factor_random = pd[1][3] # p.i = gl_InstanceID # particles.length = pd[0][3] # gxyz - vert.write('p_velocity.x += (pd[2][0] * p_age) / 5;') - vert.write('p_velocity.y += (pd[2][1] * p_age) / 5;') - vert.write('p_velocity.z += (pd[2][2] * p_age) / 5;') + vert.write('p_velocity.x += (pd[2][0] / (2 * pd_size)) * p_age;') + vert.write('p_velocity.y += (pd[2][1] / (2 * pd_size)) * p_age;') + vert.write('p_velocity.z += (pd[2][2] / (2 * pd_size)) * p_age;') prep = 'vec3 ' if out_location: @@ -80,6 +159,96 @@ def write(vert, particle_info=None, shadowmap=False): vert.write('spos.xyz += p_location;') + # Rotation + if use_rotations: + if rotation_mode != 'NONE': + vert.write(f'float p_angle = ({phase_factor} + (fhash(gl_InstanceID + pd_random + 5 * pd[0][3])) * {phase_factor_random});') + vert.write('p_angle *= 3.141592;') + vert.write('float c = cos(p_angle);') + vert.write('float s = sin(p_angle);') + vert.write('vec3 center = spos.xyz - p_location;') + + match rotation_mode: + case 'OB_X': + vert.write('vec3 rz = vec3(center.y, -center.x, center.z);') + vert.write('vec2 rotation = vec2(rz.y * c - rz.z * s, rz.y * s + rz.z * c);') + vert.write('spos.xyz = vec3(rz.x, rotation.x, rotation.y) + p_location;') + + if (not shadowmap): + vert.write('wnormal = vec3(wnormal.y, -wnormal.x, wnormal.z);') + vert.write('vec2 n_rot = vec2(wnormal.y * c - wnormal.z * s, wnormal.y * s + wnormal.z * c);') + vert.write('wnormal = normalize(vec3(wnormal.x, n_rot.x, n_rot.y));') + case 'OB_Y': + vert.write('vec2 rotation = vec2(center.x * c + center.z * s, -center.x * s + center.z * c);') + vert.write('spos.xyz = vec3(rotation.x, center.y, rotation.y) + p_location;') + + if (not shadowmap): + vert.write('wnormal = normalize(vec3(wnormal.x * c + wnormal.z * s, wnormal.y, -wnormal.x * s + wnormal.z * c));') + case 'OB_Z': + vert.write('vec3 rz = vec3(center.y, -center.x, center.z);') + vert.write('vec3 ry = vec3(-rz.z, rz.y, rz.x);') + vert.write('vec2 rotation = vec2(ry.x * c - ry.y * s, ry.x * s + ry.y * c);') + vert.write('spos.xyz = vec3(rotation.x, rotation.y, ry.z) + p_location;') + + if (not shadowmap): + vert.write('wnormal = vec3(wnormal.y, -wnormal.x, wnormal.z);') + vert.write('wnormal = vec3(-wnormal.z, wnormal.y, wnormal.x);') + vert.write('vec2 n_rot = vec2(wnormal.x * c - wnormal.y * s, wnormal.x * s + wnormal.y * c);') + vert.write('wnormal = normalize(vec3(n_rot.x, n_rot.y, wnormal.z));') + case 'VEL': + vert.write('vec3 forward = -normalize(p_velocity);') + vert.write('if (length(forward) > 1e-5) {') + vert.write('vec3 world_up = vec3(0.0, 0.0, 1.0);') + + vert.write('if (abs(dot(forward, world_up)) > 0.999) {') + vert.write('world_up = vec3(-1.0, 0.0, 0.0);') + vert.write('}') + + vert.write('vec3 right = cross(world_up, forward);') + vert.write('if (length(right) < 1e-5) {') + vert.write('forward = -forward;') + vert.write('right = cross(world_up, forward);') + vert.write('}') + vert.write('right = normalize(right);') + vert.write('vec3 up = normalize(cross(forward, right));') + + vert.write('mat3 rot = mat3(right, -forward, up);') + vert.write('mat3 phase = mat3(vec3(c, 0.0, -s), vec3(0.0, 1.0, 0.0), vec3(s, 0.0, c));') + vert.write('mat3 final_rot = rot * phase;') + vert.write('spos.xyz = final_rot * center + p_location;') + + if (not shadowmap): + vert.write('wnormal = normalize(final_rot * wnormal);') + vert.write('}') + + if rotation_factor_random != 0: + str_rotate_around = '''vec3 rotate_around(vec3 v, vec3 angle) { + // Rotate around X + float cx = cos(angle.x); + float sx = sin(angle.x); + v = vec3(v.x, v.y * cx - v.z * sx, v.y * sx + v.z * cx); + // Rotate around Y + float cy = cos(angle.y); + float sy = sin(angle.y); + v = vec3(v.x * cy + v.z * sy, v.y, -v.x * sy + v.z * cy); + // Rotate around Z + float cz = cos(angle.z); + float sz = sin(angle.z); + v = vec3(v.x * cz - v.y * sz, v.x * sz + v.y * cz, v.z); + return v; + }''' + vert.add_function(str_rotate_around) + + vert.write(f'''vec3 r_angle = vec3((fhash(gl_InstanceID + pd_random + 6 * pd[0][3]) * 4 - 2) * {rotation_factor_random}, + (fhash(gl_InstanceID + pd_random + 7 * pd[0][3]) * 4 - 2) * {rotation_factor_random}, + (fhash(gl_InstanceID + pd_random + 8 * pd[0][3]) * 4 - 2) * {rotation_factor_random});''') + vert.write('vec3 r_center = spos.xyz - p_location;') + vert.write('r_center = rotate_around(r_center, r_angle);') + vert.write('spos.xyz = r_center + p_location;') + + if not shadowmap: + vert.write('wnormal = normalize(rotate_around(wnormal, r_angle));') + # Particle fade if mat_state.material.lnx_particle_flag and lnx.utils.get_rp().lnx_particles == 'On' and mat_state.material.lnx_particle_fade: vert.add_out('float p_fade') From a3c2be4e796c860c8fa1f37863b0c514136285d2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:16:29 +0000 Subject: [PATCH 08/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/props.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/props.py b/leenkx/blender/lnx/props.py index 23be0a8e..4a5a6666 100644 --- a/leenkx/blender/lnx/props.py +++ b/leenkx/blender/lnx/props.py @@ -541,8 +541,10 @@ def init_properties(): bpy.types.Node.lnx_watch = BoolProperty(name="Watch", description="Watch value of this node in debug console", default=False) bpy.types.Node.lnx_version = IntProperty(name="Node Version", description="The version of an instanced node", default=0) # Particles - bpy.types.ParticleSettings.lnx_count_mult = FloatProperty(name="Multiply Count", description="Multiply particle count when rendering in Leenkx", default=1.0) + bpy.types.ParticleSettings.lnx_auto_start = BoolProperty(name="Auto Start", description="Automatically start this particle system on load", default=True) + bpy.types.ParticleSettings.lnx_is_unique = BoolProperty(name="Is Unique", description="Make this particle system look different each time it starts", default=False) bpy.types.ParticleSettings.lnx_loop = BoolProperty(name="Loop", description="Loop this particle system", default=False) + bpy.types.ParticleSettings.lnx_count_mult = FloatProperty(name="Multiply Count", description="Multiply particle count when rendering in Leenkx", default=1.0) # Actions bpy.types.Action.lnx_root_motion_pos = BoolProperty(name="Root Motion Position", description="Enable position root motion", default=False) bpy.types.Action.lnx_root_motion_rot = BoolProperty(name="Root Motion Rotation", description="Enable rotation root motion", default=False) From 25c391d244fc681589473740cd44520f116ce727 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:17:30 +0000 Subject: [PATCH 09/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/props_ui.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index c266d9cb..7624fe8d 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -205,6 +205,8 @@ class LNX_PT_ParticlesPropsPanel(bpy.types.Panel): if obj == None: return + layout.prop(obj.settings, 'lnx_auto_start') + layout.prop(obj.settings, 'lnx_is_unique') layout.prop(obj.settings, 'lnx_loop') layout.prop(obj.settings, 'lnx_count_mult') From 2aa6be64964f5b194d5ce4c35607747636d5e882 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:52:16 +0000 Subject: [PATCH 10/92] moisesjpelaez - Physics Private Fields --- .../logicnode/AddParticleToObjectNode.hx | 198 +++++++++--------- 1 file changed, 99 insertions(+), 99 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/AddParticleToObjectNode.hx b/leenkx/Sources/leenkx/logicnode/AddParticleToObjectNode.hx index ae2ff19a..5bcd6b04 100644 --- a/leenkx/Sources/leenkx/logicnode/AddParticleToObjectNode.hx +++ b/leenkx/Sources/leenkx/logicnode/AddParticleToObjectNode.hx @@ -1,99 +1,99 @@ -package leenkx.logicnode; - -import iron.data.SceneFormat.TSceneFormat; -import iron.data.Data; -import iron.object.Object; - -class AddParticleToObjectNode extends LogicNode { - - public var property0: String; - - public function new(tree: LogicTree) { - super(tree); - } - - override function run(from: Int) { - #if lnx_particles - - if (property0 == 'Scene Active'){ - var objFrom: Object = inputs[1].get(); - var slot: Int = inputs[2].get(); - var objTo: Object = inputs[3].get(); - - if (objFrom == null || objTo == null) return; - - var mobjFrom = cast(objFrom, iron.object.MeshObject); - - var psys = mobjFrom.particleSystems != null ? mobjFrom.particleSystems[slot] : - mobjFrom.particleOwner != null && mobjFrom.particleOwner.particleSystems != null ? mobjFrom.particleOwner.particleSystems[slot] : null; - - if (psys == null) return; - - var mobjTo = cast(objTo, iron.object.MeshObject); - - mobjTo.setupParticleSystem(iron.Scene.active.raw.name, {name: 'LnxPS', seed: 0, particle: psys.r.name}); - - mobjTo.render_emitter = inputs[4].get(); - - iron.Scene.active.spawnObject(psys.data.raw.instance_object, null, function(o: Object) { - if (o != null) { - var c: iron.object.MeshObject = cast o; - if (mobjTo.particleChildren == null) mobjTo.particleChildren = []; - mobjTo.particleChildren.push(c); - c.particleOwner = mobjTo; - c.particleIndex = mobjTo.particleChildren.length - 1; - } - }); - - var oslot: Int = mobjTo.particleSystems.length-1; - var opsys = mobjTo.particleSystems[oslot]; - opsys.setupGeomGpu(mobjTo.particleChildren[oslot], mobjTo); - - } else { - var sceneName: String = inputs[1].get(); - var objectName: String = inputs[2].get(); - var slot: Int = inputs[3].get(); - - var mobjTo: Object = inputs[4].get(); - var mobjTo = cast(mobjTo, iron.object.MeshObject); - - #if lnx_json - sceneName += ".json"; - #elseif lnx_compress - sceneName += ".lz4"; - #end - - Data.getSceneRaw(sceneName, (rawScene: TSceneFormat) -> { - - for (obj in rawScene.objects) { - if (obj.name == objectName) { - mobjTo.setupParticleSystem(sceneName, obj.particle_refs[slot]); - mobjTo.render_emitter = inputs[5].get(); - - iron.Scene.active.spawnObject(rawScene.particle_datas[slot].instance_object, null, function(o: Object) { - if (o != null) { - var c: iron.object.MeshObject = cast o; - if (mobjTo.particleChildren == null) mobjTo.particleChildren = []; - mobjTo.particleChildren.push(c); - c.particleOwner = mobjTo; - c.particleIndex = mobjTo.particleChildren.length - 1; - } - }, true, rawScene); - - var oslot: Int = mobjTo.particleSystems.length-1; - var opsys = mobjTo.particleSystems[oslot]; - opsys.setupGeomGpu(mobjTo.particleChildren[oslot], mobjTo); - - break; - } - } - - }); - - } - - #end - - runOutput(0); - } -} +package leenkx.logicnode; + +import iron.data.SceneFormat.TSceneFormat; +import iron.data.Data; +import iron.object.Object; + +class AddParticleToObjectNode extends LogicNode { + + public var property0: String; + + public function new(tree: LogicTree) { + super(tree); + } + + override function run(from: Int) { + #if lnx_particles + + if (property0 == 'Scene Active'){ + var objFrom: Object = inputs[1].get(); + var slot: Int = inputs[2].get(); + var objTo: Object = inputs[3].get(); + + if (objFrom == null || objTo == null) return; + + var mobjFrom = cast(objFrom, iron.object.MeshObject); + + var psys = mobjFrom.particleSystems != null ? mobjFrom.particleSystems[slot] : + mobjFrom.particleOwner != null && mobjFrom.particleOwner.particleSystems != null ? mobjFrom.particleOwner.particleSystems[slot] : null; + + if (psys == null) return; + + var mobjTo = cast(objTo, iron.object.MeshObject); + + mobjTo.setupParticleSystem(iron.Scene.active.raw.name, {name: 'LnxPS', seed: 0, particle: @:privateAccess psys.r.name}); + + mobjTo.render_emitter = inputs[4].get(); + + iron.Scene.active.spawnObject(psys.data.raw.instance_object, null, function(o: Object) { + if (o != null) { + var c: iron.object.MeshObject = cast o; + if (mobjTo.particleChildren == null) mobjTo.particleChildren = []; + mobjTo.particleChildren.push(c); + c.particleOwner = mobjTo; + c.particleIndex = mobjTo.particleChildren.length - 1; + } + }); + + var oslot: Int = mobjTo.particleSystems.length-1; + var opsys = mobjTo.particleSystems[oslot]; + @:privateAccess opsys.setupGeomGpu(mobjTo.particleChildren[oslot], mobjTo); + + } else { + var sceneName: String = inputs[1].get(); + var objectName: String = inputs[2].get(); + var slot: Int = inputs[3].get(); + + var mobjTo: Object = inputs[4].get(); + var mobjTo = cast(mobjTo, iron.object.MeshObject); + + #if lnx_json + sceneName += ".json"; + #elseif lnx_compress + sceneName += ".lz4"; + #end + + Data.getSceneRaw(sceneName, (rawScene: TSceneFormat) -> { + + for (obj in rawScene.objects) { + if (obj.name == objectName) { + mobjTo.setupParticleSystem(sceneName, obj.particle_refs[slot]); + mobjTo.render_emitter = inputs[5].get(); + + iron.Scene.active.spawnObject(rawScene.particle_datas[slot].instance_object, null, function(o: Object) { + if (o != null) { + var c: iron.object.MeshObject = cast o; + if (mobjTo.particleChildren == null) mobjTo.particleChildren = []; + mobjTo.particleChildren.push(c); + c.particleOwner = mobjTo; + c.particleIndex = mobjTo.particleChildren.length - 1; + } + }, true, rawScene); + + var oslot: Int = mobjTo.particleSystems.length-1; + var opsys = mobjTo.particleSystems[oslot]; + @:privateAccess opsys.setupGeomGpu(mobjTo.particleChildren[oslot], mobjTo); + + break; + } + } + + }); + + } + + #end + + runOutput(0); + } +} From cdf79de36b85f69d40a2e37aa8c720e0dcb35849 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:55:55 +0000 Subject: [PATCH 11/92] moisesjpelaez - Physics Private Fields --- .../leenkx/logicnode/GetParticleDataNode.hx | 132 +++++++++--------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx b/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx index 2b2b6698..bad5504e 100644 --- a/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx +++ b/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx @@ -1,66 +1,66 @@ -package leenkx.logicnode; - -import iron.object.Object; - -class GetParticleDataNode extends LogicNode { - - public function new(tree: LogicTree) { - super(tree); - } - - override function get(from: Int): Dynamic { - var object: Object = inputs[0].get(); - var slot: Int = inputs[1].get(); - - if (object == null) return null; - - #if lnx_particles - - var mo = cast(object, iron.object.MeshObject); - - var psys = mo.particleSystems != null ? mo.particleSystems[slot] : - mo.particleOwner != null && mo.particleOwner.particleSystems != null ? mo.particleOwner.particleSystems[slot] : null; - - if (psys == null) return null; - - return switch (from) { - case 0: - psys.r.name; - case 1: - psys.r.particle_size; - case 2: - psys.r.frame_start; - case 3: - psys.r.frame_end; - case 4: - psys.lifetime; - case 5: - psys.r.lifetime; - case 6: - psys.r.emit_from; - case 7: - new iron.math.Vec3(psys.alignx*2, psys.aligny*2, psys.alignz*2); - case 8: - psys.r.factor_random; - case 9: - new iron.math.Vec3(psys.gx, psys.gy, psys.gz); - case 10: - psys.r.weight_gravity; - case 11: - psys.speed; - case 12: - psys.time; - case 13: - psys.lap; - case 14: - psys.lapTime; - case 15: - psys.count; - default: - null; - } - #end - - return null; - } -} +package leenkx.logicnode; + +import iron.object.Object; + +class GetParticleDataNode extends LogicNode { + + public function new(tree: LogicTree) { + super(tree); + } + + override function get(from: Int): Dynamic { + var object: Object = inputs[0].get(); + var slot: Int = inputs[1].get(); + + if (object == null) return null; + + #if lnx_particles + + var mo = cast(object, iron.object.MeshObject); + + var psys = mo.particleSystems != null ? mo.particleSystems[slot] : + mo.particleOwner != null && mo.particleOwner.particleSystems != null ? mo.particleOwner.particleSystems[slot] : null; + + if (psys == null) return null; + + return switch (from) { + case 0: + @:privateAccess psys.r.name; + case 1: + @:privateAccess psys.r.particle_size; + case 2: + @:privateAccess psys.r.frame_start; + case 3: + @:privateAccess psys.r.frame_end; + case 4: + @:privateAccess psys.lifetime; + case 5: + @:privateAccess psys.r.lifetime; + case 6: + @:privateAccess psys.r.emit_from; + case 7: + new iron.math.Vec3(@:privateAccess psys.alignx*2, @:privateAccess psys.aligny*2, @:privateAccess psys.alignz*2); + case 8: + @:privateAccess psys.r.factor_random; + case 9: + new iron.math.Vec3(@:privateAccess psys.gx, @:privateAccess psys.gy, @:privateAccess psys.gz); + case 10: + @:privateAccess psys.r.weight_gravity; + case 11: + psys.speed; + case 12: + @:privateAccess psys.time; + case 13: + @:privateAccess psys.lap; + case 14: + @:privateAccess psys.lapTime; + case 15: + @:privateAccess psys.count; + default: + null; + } + #end + + return null; + } +} From 1a17b646e4e8d0fed87f82de83ff4600fb1337f4 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:56:48 +0000 Subject: [PATCH 12/92] moisesjpelaez - Physics Private Fields --- .../leenkx/logicnode/GetParticleNode.hx | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/GetParticleNode.hx b/leenkx/Sources/leenkx/logicnode/GetParticleNode.hx index 1a2df24b..7b9b9c15 100644 --- a/leenkx/Sources/leenkx/logicnode/GetParticleNode.hx +++ b/leenkx/Sources/leenkx/logicnode/GetParticleNode.hx @@ -1,38 +1,38 @@ -package leenkx.logicnode; - -import iron.object.Object; - -class GetParticleNode extends LogicNode { - - public function new(tree: LogicTree) { - super(tree); - } - - override function get(from: Int): Dynamic { - var object: Object = inputs[0].get(); - - if (object == null) return null; - - #if lnx_particles - - var mo = cast(object, iron.object.MeshObject); - - switch (from) { - case 0: - var names: Array = []; - if (mo.particleSystems != null) - for (psys in mo.particleSystems) - names.push(psys.r.name); - return names; - case 1: - return mo.particleSystems != null ? mo.particleSystems.length : 0; - case 2: - return mo.render_emitter; - default: - null; - } - #end - - return null; - } -} +package leenkx.logicnode; + +import iron.object.Object; + +class GetParticleNode extends LogicNode { + + public function new(tree: LogicTree) { + super(tree); + } + + override function get(from: Int): Dynamic { + var object: Object = inputs[0].get(); + + if (object == null) return null; + + #if lnx_particles + + var mo = cast(object, iron.object.MeshObject); + + switch (from) { + case 0: + var names: Array = []; + if (mo.particleSystems != null) + for (psys in mo.particleSystems) + names.push(@:privateAccess psys.r.name); + return names; + case 1: + return mo.particleSystems != null ? mo.particleSystems.length : 0; + case 2: + return mo.render_emitter; + default: + null; + } + #end + + return null; + } +} From 32cdbd8c54d7e2dce8fbb48c2023957241c6a4d2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 22:57:47 +0000 Subject: [PATCH 13/92] moisesjpelaez - Physics Private Fields --- .../logicnode/RemoveParticleFromObjectNode.hx | 128 +++++++++--------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/RemoveParticleFromObjectNode.hx b/leenkx/Sources/leenkx/logicnode/RemoveParticleFromObjectNode.hx index 17f7ef72..573444ff 100644 --- a/leenkx/Sources/leenkx/logicnode/RemoveParticleFromObjectNode.hx +++ b/leenkx/Sources/leenkx/logicnode/RemoveParticleFromObjectNode.hx @@ -1,64 +1,64 @@ -package leenkx.logicnode; - -import iron.object.Object; - -class RemoveParticleFromObjectNode extends LogicNode { - - public var property0: String; - - public function new(tree: LogicTree) { - super(tree); - } - - override function run(from: Int) { - #if lnx_particles - var object: Object = inputs[1].get(); - - if (object == null) return; - - var mo = cast(object, iron.object.MeshObject); - - if (mo.particleSystems == null) return; - - if (property0 == 'All'){ - mo.particleSystems = null; - for (c in mo.particleChildren) c.remove(); - mo.particleChildren = null; - mo.particleOwner = null; - mo.render_emitter = true; - } - else { - - var slot: Int = -1; - if (property0 == 'Name'){ - var name: String = inputs[2].get(); - for (i => psys in mo.particleSystems){ - if (psys.r.name == name){ slot = i; break; } - } - } - else slot = inputs[2].get(); - - if (mo.particleSystems.length > slot){ - for (i in slot+1...mo.particleSystems.length){ - var mi = cast(mo.particleChildren[i], iron.object.MeshObject); - mi.particleIndex = mi.particleIndex - 1; - } - mo.particleSystems.splice(slot, 1); - mo.particleChildren[slot].remove(); - mo.particleChildren.splice(slot, 1); - } - - if (slot == 0){ - mo.particleSystems = null; - mo.particleChildren = null; - mo.particleOwner = null; - mo.render_emitter = true; - } - - } - - #end - - runOutput(0); - } -} +package leenkx.logicnode; + +import iron.object.Object; + +class RemoveParticleFromObjectNode extends LogicNode { + + public var property0: String; + + public function new(tree: LogicTree) { + super(tree); + } + + override function run(from: Int) { + #if lnx_particles + var object: Object = inputs[1].get(); + + if (object == null) return; + + var mo = cast(object, iron.object.MeshObject); + + if (mo.particleSystems == null) return; + + if (property0 == 'All'){ + mo.particleSystems = null; + for (c in mo.particleChildren) c.remove(); + mo.particleChildren = null; + mo.particleOwner = null; + mo.render_emitter = true; + } + else { + + var slot: Int = -1; + if (property0 == 'Name'){ + var name: String = inputs[2].get(); + for (i => psys in mo.particleSystems){ + if (@:privateAccess psys.r.name == name){ slot = i; break; } + } + } + else slot = inputs[2].get(); + + if (mo.particleSystems.length > slot){ + for (i in slot+1...mo.particleSystems.length){ + var mi = cast(mo.particleChildren[i], iron.object.MeshObject); + mi.particleIndex = mi.particleIndex - 1; + } + mo.particleSystems.splice(slot, 1); + mo.particleChildren[slot].remove(); + mo.particleChildren.splice(slot, 1); + } + + if (slot == 0){ + mo.particleSystems = null; + mo.particleChildren = null; + mo.particleOwner = null; + mo.render_emitter = true; + } + + } + + #end + + runOutput(0); + } +} From a6d9cb92012344017faac6e0ca3a2d08b6417df7 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:02:50 +0000 Subject: [PATCH 14/92] moisesjpelaez - Physics Private Fields --- .../leenkx/logicnode/SetParticleDataNode.hx | 150 +++++++++--------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx b/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx index acf6071e..6b80f20e 100644 --- a/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx +++ b/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx @@ -1,75 +1,75 @@ -package leenkx.logicnode; - -import iron.object.Object; - -class SetParticleDataNode extends LogicNode { - - public var property0: String; - - public function new(tree: LogicTree) { - super(tree); - } - - override function run(from: Int) { - #if lnx_particles - var object: Object = inputs[1].get(); - var slot: Int = inputs[2].get(); - - if (object == null) return; - - var mo = cast(object, iron.object.MeshObject); - - var psys = mo.particleSystems != null ? mo.particleSystems[slot] : - mo.particleOwner != null && mo.particleOwner.particleSystems != null ? mo.particleOwner.particleSystems[slot] : null; if (psys == null) return; - - switch (property0) { - case 'Particle Size': - psys.r.particle_size = inputs[3].get(); - case 'Frame Start': - psys.r.frame_start = inputs[3].get(); - psys.animtime = (psys.r.frame_end - psys.r.frame_start) / psys.frameRate; - psys.spawnRate = ((psys.r.frame_end - psys.r.frame_start) / psys.count) / psys.frameRate; - case 'Frame End': - psys.r.frame_end = inputs[3].get(); - psys.animtime = (psys.r.frame_end - psys.r.frame_start) / psys.frameRate; - psys.spawnRate = ((psys.r.frame_end - psys.r.frame_start) / psys.count) / psys.frameRate; - case 'Lifetime': - psys.lifetime = inputs[3].get() / psys.frameRate; - case 'Lifetime Random': - psys.r.lifetime_random = inputs[3].get(); - case 'Emit From': - var emit_from: Int = inputs[3].get(); - if (emit_from == 0 || emit_from == 1 || emit_from == 2) { - psys.r.emit_from = emit_from; - psys.setupGeomGpu(mo.particleChildren != null ? mo.particleChildren[slot] : cast(iron.Scene.active.getChild(psys.data.raw.instance_object), iron.object.MeshObject), mo); - } - case 'Velocity': - var vel: iron.math.Vec3 = inputs[3].get(); - psys.alignx = vel.x / 2; - psys.aligny = vel.y / 2; - psys.alignz = vel.z / 2; - case 'Velocity Random': - psys.r.factor_random = inputs[3].get(); - case 'Weight Gravity': - psys.r.weight_gravity = inputs[3].get(); - if (iron.Scene.active.raw.gravity != null) { - psys.gx = iron.Scene.active.raw.gravity[0] * psys.r.weight_gravity; - psys.gy = iron.Scene.active.raw.gravity[1] * psys.r.weight_gravity; - psys.gz = iron.Scene.active.raw.gravity[2] * psys.r.weight_gravity; - } - else { - psys.gx = 0; - psys.gy = 0; - psys.gz = -9.81 * psys.r.weight_gravity; - } - case 'Speed': - psys.speed = inputs[3].get(); - default: - null; - } - - #end - - runOutput(0); - } -} +package leenkx.logicnode; + +import iron.object.Object; + +class SetParticleDataNode extends LogicNode { + + public var property0: String; + + public function new(tree: LogicTree) { + super(tree); + } + + override function run(from: Int) { + #if lnx_particles + var object: Object = inputs[1].get(); + var slot: Int = inputs[2].get(); + + if (object == null) return; + + var mo = cast(object, iron.object.MeshObject); + + var psys = mo.particleSystems != null ? mo.particleSystems[slot] : + mo.particleOwner != null && mo.particleOwner.particleSystems != null ? mo.particleOwner.particleSystems[slot] : null; if (psys == null) return; + + switch (property0) { + case 'Particle Size': + @:privateAccess psys.r.particle_size = inputs[3].get(); + case 'Frame Start': + @:privateAccess psys.r.frame_start = inputs[3].get(); + @:privateAccess psys.animtime = (@:privateAccess psys.r.frame_end - @:privateAccess psys.r.frame_start) / @:privateAccess psys.frameRate; + @:privateAccess psys.spawnRate = ((@:privateAccess psys.r.frame_end - @:privateAccess psys.r.frame_start) / @:privateAccess psys.count) / @:privateAccess psys.frameRate; + case 'Frame End': + @:privateAccess psys.r.frame_end = inputs[3].get(); + @:privateAccess psys.animtime = (@:privateAccess psys.r.frame_end - @:privateAccess psys.r.frame_start) / @:privateAccess psys.frameRate; + @:privateAccess psys.spawnRate = ((@:privateAccess psys.r.frame_end - @:privateAccess psys.r.frame_start) / @:privateAccess psys.count) / @:privateAccess psys.frameRate; + case 'Lifetime': + @:privateAccess psys.lifetime = inputs[3].get() / @:privateAccess psys.frameRate; + case 'Lifetime Random': + @:privateAccess psys.r.lifetime_random = inputs[3].get(); + case 'Emit From': + var emit_from: Int = inputs[3].get(); + if (emit_from == 0 || emit_from == 1 || emit_from == 2) { + @:privateAccess psys.r.emit_from = emit_from; + @:privateAccess psys.setupGeomGpu(mo.particleChildren != null ? mo.particleChildren[slot] : cast(iron.Scene.active.getChild(psys.data.raw.instance_object), iron.object.MeshObject), mo); + } + case 'Velocity': + var vel: iron.math.Vec3 = inputs[3].get(); + @:privateAccess psys.alignx = vel.x / 2; + @:privateAccess psys.aligny = vel.y / 2; + @:privateAccess psys.alignz = vel.z / 2; + case 'Velocity Random': + psys.r.factor_random = inputs[3].get(); + case 'Weight Gravity': + psys.r.weight_gravity = inputs[3].get(); + if (iron.Scene.active.raw.gravity != null) { + @:privateAccess psys.gx = iron.Scene.active.raw.gravity[0] * @:privateAccess psys.r.weight_gravity; + @:privateAccess psys.gy = iron.Scene.active.raw.gravity[1] * @:privateAccess psys.r.weight_gravity; + @:privateAccess psys.gz = iron.Scene.active.raw.gravity[2] * @:privateAccess psys.r.weight_gravity; + } + else { + @:privateAccess psys.gx = 0; + @:privateAccess psys.gy = 0; + @:privateAccess psys.gz = -9.81 * @:privateAccess psys.r.weight_gravity; + } + case 'Speed': + psys.speed = inputs[3].get(); + default: + null; + } + + #end + + runOutput(0); + } +} From cfbe7c83cb52f1cbdffa97d0abd62c072d193692 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:09:47 +0000 Subject: [PATCH 15/92] moisesjpelaez - Add fixedUpdate for Physics --- .../leenkx/trait/physics/bullet/PhysicsWorld.hx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx index e2bea17e..bd325089 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx @@ -136,10 +136,10 @@ class PhysicsWorld extends Trait { conMap = new Map(); active = this; - // Ensure physics are updated first in the lateUpdate list - _lateUpdate = [lateUpdate]; - @:privateAccess iron.App.traitLateUpdates.insert(0, lateUpdate); - + // Ensure physics are updated first in the fixedUpdate list + _fixedUpdate = [fixedUpdate]; + @:privateAccess iron.App.traitFixedUpdates.insert(0, fixedUpdate); + setDebugDrawMode(debugDrawMode); iron.Scene.active.notifyOnRemove(function() { @@ -298,7 +298,7 @@ class PhysicsWorld extends Trait { return rb; } - function lateUpdate() { + function fixedUpdate() { var t = Time.delta * timeScale; if (t == 0.0) return; // Simulation paused @@ -312,9 +312,9 @@ class PhysicsWorld extends Trait { var fixedTime = 1.0 / 60; //This condition must be satisfied to not loose time - var currMaxSteps = t < (fixedTime * maxSteps) ? maxSteps : 1; + var currMaxSteps = t < (Time.fixedStep * maxSteps) ? maxSteps : 1; - world.stepSimulation(t, currMaxSteps, fixedTime); + world.stepSimulation(t, currMaxSteps, Time.fixedStep); updateContacts(); for (rb in rbMap) @:privateAccess rb.physicsUpdate(); From 29a4bb6803abefccb805090976cd8a825639869b Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:14:43 +0000 Subject: [PATCH 16/92] moisesjpelaez - Add fixedUpdate for Physics --- leenkx/Sources/iron/App.hx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/leenkx/Sources/iron/App.hx b/leenkx/Sources/iron/App.hx index 6d0f6f62..eb4f653e 100644 --- a/leenkx/Sources/iron/App.hx +++ b/leenkx/Sources/iron/App.hx @@ -12,6 +12,7 @@ class App { static var traitInits: ArrayVoid> = []; static var traitUpdates: ArrayVoid> = []; static var traitLateUpdates: ArrayVoid> = []; + static var traitFixedUpdates: ArrayVoid> = []; static var traitRenders: ArrayVoid> = []; static var traitRenders2D: ArrayVoid> = []; public static var framebuffer: kha.Framebuffer; @@ -23,6 +24,8 @@ class App { public static var renderPathTime: Float; public static var endFrameCallbacks: ArrayVoid> = []; #end + static var last = 0.0; + static var time = 0.0; static var lastw = -1; static var lasth = -1; public static var onResize: Void->Void = null; @@ -41,6 +44,7 @@ class App { traitInits = []; traitUpdates = []; traitLateUpdates = []; + traitFixedUpdates = []; traitRenders = []; traitRenders2D = []; if (onResets != null) for (f in onResets) f(); @@ -77,6 +81,13 @@ class App { l <= traitLateUpdates.length ? i++ : l = traitLateUpdates.length; } + time += iron.system.Time.realTime() - last; + last = iron.system.Time.realTime(); + while (time >= iron.system.Time.fixedStep) { + for (f in traitFixedUpdates) f(); + time -= iron.system.Time.fixedStep; + } + if (onEndFrames != null) for (f in onEndFrames) f(); #if lnx_debug @@ -172,6 +183,14 @@ class App { traitLateUpdates.remove(f); } + public static function notifyOnFixedUpdate(f: Void->Void) { + traitFixedUpdates.push(f); + } + + public static function removeFixedUpdate(f: Void->Void) { + traitFixedUpdates.remove(f); + } + public static function notifyOnRender(f: kha.graphics4.Graphics->Void) { traitRenders.push(f); } From 502601e684676d474834ffb049e3691af7c88bf6 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:17:23 +0000 Subject: [PATCH 17/92] moisesjpelaez - Add fixedUpdate for Physics --- leenkx/Sources/iron/Trait.hx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/leenkx/Sources/iron/Trait.hx b/leenkx/Sources/iron/Trait.hx index 854385d7..dd63b001 100644 --- a/leenkx/Sources/iron/Trait.hx +++ b/leenkx/Sources/iron/Trait.hx @@ -16,6 +16,7 @@ class Trait { var _remove: ArrayVoid> = null; var _update: ArrayVoid> = null; var _lateUpdate: ArrayVoid> = null; + var _fixedUpdate: ArrayVoid> = null; var _render: ArrayVoid> = null; var _render2D: ArrayVoid> = null; @@ -87,6 +88,23 @@ class Trait { App.removeLateUpdate(f); } + /** + Add fixed game logic handler. + **/ + public function notifyOnFixedUpdate(f: Void->Void) { + if (_fixedUpdate == null) _fixedUpdate = []; + _fixedUpdate.push(f); + App.notifyOnFixedUpdate(f); + } + + /** + Remove fixed game logic handler. + **/ + public function removeFixedUpdate(f: Void->Void) { + _fixedUpdate.remove(f); + App.removeFixedUpdate(f); + } + /** Add render handler. **/ From 016e223fb8155348c4dc209afa361db177b807ad Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:18:35 +0000 Subject: [PATCH 18/92] moisesjpelaez - Add fixedUpdate for Physics --- leenkx/Sources/iron/system/Time.hx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/leenkx/Sources/iron/system/Time.hx b/leenkx/Sources/iron/system/Time.hx index c82d8020..7b6cd221 100644 --- a/leenkx/Sources/iron/system/Time.hx +++ b/leenkx/Sources/iron/system/Time.hx @@ -7,7 +7,13 @@ class Time { if (frequency == null) initFrequency(); return 1 / frequency; } - + + // TODO: set physics step from Blender's editor + public static var fixedStep(get, never): Float; + static function get_fixedStep(): Float { + return 1 / 60; + } + public static var scale = 1.0; public static var delta(get, never): Float; static function get_delta(): Float { From a6f83e2d375d46d8b1d0eabe96e94adb99000964 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:29:09 +0000 Subject: [PATCH 19/92] moisesjpelaez - Framerate and delta fixes --- leenkx/Sources/iron/object/Animation.hx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/iron/object/Animation.hx b/leenkx/Sources/iron/object/Animation.hx index e86f500b..1a3ec9bf 100644 --- a/leenkx/Sources/iron/object/Animation.hx +++ b/leenkx/Sources/iron/object/Animation.hx @@ -159,9 +159,17 @@ class Animation { if(markerEvents.get(sampler) != null){ for (i in 0...anim.marker_frames.length) { if (frameIndex == anim.marker_frames[i]) { - var marketAct = markerEvents.get(sampler); - var ar = marketAct.get(anim.marker_names[i]); + var markerAct = markerEvents.get(sampler); + var ar = markerAct.get(anim.marker_names[i]); if (ar != null) for (f in ar) f(); + } else { + for (j in 0...(frameIndex - lastFrameIndex)) { + if (lastFrameIndex + j + 1 == anim.marker_frames[i]) { + var markerAct = markerEvents.get(sampler); + var ar = markerAct.get(anim.marker_names[i]); + if (ar != null) for (f in ar) f(); + } + } } } lastFrameIndex = frameIndex; From b752d701099ef6e3690437be175771407ae6cee1 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:29:57 +0000 Subject: [PATCH 20/92] moisesjpelaez - Framerate and delta fixes --- leenkx/Sources/leenkx/logicnode/GetFPSNode.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/logicnode/GetFPSNode.hx b/leenkx/Sources/leenkx/logicnode/GetFPSNode.hx index 0f58c04a..f915b7e1 100644 --- a/leenkx/Sources/leenkx/logicnode/GetFPSNode.hx +++ b/leenkx/Sources/leenkx/logicnode/GetFPSNode.hx @@ -8,7 +8,7 @@ class GetFPSNode extends LogicNode { override function get(from: Int): Dynamic { if (from == 0) { - var fps = Math.round(1 / iron.system.Time.realDelta); + var fps = Math.round(1 / iron.system.Time.renderDelta); if ((fps == Math.POSITIVE_INFINITY) || (fps == Math.NEGATIVE_INFINITY) || (Math.isNaN(fps))) { return 0; } From 3ff6c32ac982d1c883e73d6c048bde0540e78910 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:31:49 +0000 Subject: [PATCH 21/92] moisesjpelaez - Framerate and delta fixes --- leenkx/Sources/iron/object/Tilesheet.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/iron/object/Tilesheet.hx b/leenkx/Sources/iron/object/Tilesheet.hx index ea4e0201..86328e0c 100644 --- a/leenkx/Sources/iron/object/Tilesheet.hx +++ b/leenkx/Sources/iron/object/Tilesheet.hx @@ -80,7 +80,7 @@ class Tilesheet { function update() { if (!ready || paused || action.start >= action.end) return; - time += Time.realDelta; + time += Time.renderDelta; var frameTime = 1 / raw.framerate; var framesToAdvance = 0; From 447af740bec097eba485fef2aa61c3af5971c398 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:33:30 +0000 Subject: [PATCH 22/92] moisesjpelaez - Framerate and delta fixes --- leenkx/Sources/iron/object/ParticleSystem.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/iron/object/ParticleSystem.hx b/leenkx/Sources/iron/object/ParticleSystem.hx index ca9fef5a..baeabac4 100644 --- a/leenkx/Sources/iron/object/ParticleSystem.hx +++ b/leenkx/Sources/iron/object/ParticleSystem.hx @@ -149,7 +149,7 @@ class ParticleSystem { } // Animate - time += Time.renderDelta * speed; + time += Time.renderDelta * speed; // realDelta to renderDelta lap = Std.int(time / animtime); lapTime = time - lap * animtime; count = Std.int(lapTime / spawnRate); From 6b7460dd4c6412059acf632450a7b9d383cce13b Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:46:05 +0000 Subject: [PATCH 23/92] moisesjpelaez - Add particles random size * Revert --- leenkx/blender/lnx/material/make_shader.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/material/make_shader.py b/leenkx/blender/lnx/material/make_shader.py index 89f4fe98..8fd4dda7 100644 --- a/leenkx/blender/lnx/material/make_shader.py +++ b/leenkx/blender/lnx/material/make_shader.py @@ -209,8 +209,7 @@ def make_instancing_and_skinning(mat: Material, mat_users: Dict[Material, List[O global_elems.append({'name': 'ipos', 'data': 'float3'}) if 'Rot' in inst: global_elems.append({'name': 'irot', 'data': 'float3'}) - #HACK: checking `mat.arm_particle_flag` to force appending 'iscl' to the particle's vertex shader - if 'Scale' in inst or mat.arm_particle_flag: + if 'Scale' in inst: global_elems.append({'name': 'iscl', 'data': 'float3'}) elif inst == 'Off': From ed72206a2654e5688eee652137b2fb35c2397360 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Sun, 1 Jun 2025 23:52:22 +0000 Subject: [PATCH 24/92] moisesjpelaez - Physics Improvements --- .../Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx index bd325089..74dd8693 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/PhysicsWorld.hx @@ -101,7 +101,7 @@ class PhysicsWorld extends Trait { - public function new(timeScale = 1.0, maxSteps = 10, solverIterations = 10, debugDrawMode: DebugDrawMode = NoDebug) { + public function new(timeScale = 1.0, maxSteps = 10, solverIterations = 10, fixedStep = 1 / 60, debugDrawMode: DebugDrawMode = NoDebug) { super(); if (nullvec) { @@ -120,6 +120,7 @@ class PhysicsWorld extends Trait { this.timeScale = timeScale; this.maxSteps = maxSteps; this.solverIterations = solverIterations; + Time.initFixedStep(fixedStep); // First scene if (active == null) { @@ -299,7 +300,7 @@ class PhysicsWorld extends Trait { } function fixedUpdate() { - var t = Time.delta * timeScale; + var t = Time.fixedStep * timeScale * Time.scale; if (t == 0.0) return; // Simulation paused #if lnx_debug @@ -308,9 +309,6 @@ class PhysicsWorld extends Trait { if (preUpdates != null) for (f in preUpdates) f(); - //Bullet physics fixed timescale - var fixedTime = 1.0 / 60; - //This condition must be satisfied to not loose time var currMaxSteps = t < (Time.fixedStep * maxSteps) ? maxSteps : 1; From 8d9f248d2fcc6126891a68ffaab6754f4e6bb608 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 04:06:31 +0000 Subject: [PATCH 25/92] moisesjpelaez - Physics Improvements --- .../leenkx/trait/physics/bullet/RigidBody.hx | 92 ++++++++++++++++--- 1 file changed, 77 insertions(+), 15 deletions(-) diff --git a/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx b/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx index 74fd9ce4..a84d7587 100644 --- a/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx +++ b/leenkx/Sources/leenkx/trait/physics/bullet/RigidBody.hx @@ -2,11 +2,13 @@ package leenkx.trait.physics.bullet; #if lnx_bullet +import leenkx.math.Helper; +import iron.data.MeshData; import iron.math.Vec4; import iron.math.Quat; import iron.object.Transform; import iron.object.MeshObject; -import iron.data.MeshData; +import iron.system.Time; /** RigidBody is used to allow objects to interact with Physics in your game including collisions and gravity. @@ -76,6 +78,14 @@ class RigidBody extends iron.Trait { static var triangleMeshCache = new Map(); static var usersCache = new Map(); + // Interpolation + var interpolate: Bool = false; + var time: Float = 0.0; + var currentPos: bullet.Bt.Vector3 = new bullet.Bt.Vector3(0, 0, 0); + var prevPos: bullet.Bt.Vector3 = new bullet.Bt.Vector3(0, 0, 0); + var currentRot: bullet.Bt.Quaternion = new bullet.Bt.Quaternion(0, 0, 0, 1); + var prevRot: bullet.Bt.Quaternion = new bullet.Bt.Quaternion(0, 0, 0, 1); + public function new(shape = Shape.Box, mass = 1.0, friction = 0.5, restitution = 0.0, group = 1, mask = 1, params: RigidBodyParams = null, flags: RigidBodyFlags = null) { super(); @@ -85,7 +95,7 @@ class RigidBody extends iron.Trait { vec1 = new bullet.Bt.Vector3(0, 0, 0); vec2 = new bullet.Bt.Vector3(0, 0, 0); vec3 = new bullet.Bt.Vector3(0, 0, 0); - quat1 = new bullet.Bt.Quaternion(0, 0, 0, 0); + quat1 = new bullet.Bt.Quaternion(0, 0, 0, 1); trans1 = new bullet.Bt.Transform(); trans2 = new bullet.Bt.Transform(); } @@ -117,6 +127,7 @@ class RigidBody extends iron.Trait { animated: false, trigger: false, ccd: false, + interpolate: false, staticObj: false, useDeactivation: true }; @@ -131,6 +142,7 @@ class RigidBody extends iron.Trait { this.animated = flags.animated; this.trigger = flags.trigger; this.ccd = flags.ccd; + this.interpolate = flags.interpolate; this.staticObj = flags.staticObj; this.useDeactivation = flags.useDeactivation; @@ -245,6 +257,9 @@ class RigidBody extends iron.Trait { quat1.setValue(quat.x, quat.y, quat.z, quat.w); trans1.setRotation(quat1); + currentPos.setValue(vec1.x(), vec1.y(), vec1.z()); + currentRot.setValue(quat.x, quat.y, quat.z, quat.w); + var centerOfMassOffset = trans2; centerOfMassOffset.setIdentity(); motionState = new bullet.Bt.DefaultMotionState(trans1, centerOfMassOffset); @@ -308,7 +323,8 @@ class RigidBody extends iron.Trait { physics.addRigidBody(this); notifyOnRemove(removeFromWorld); - + if (!animated) notifyOnUpdate(update); + if (onReady != null) onReady(); #if js @@ -318,26 +334,71 @@ class RigidBody extends iron.Trait { #end } + + function update() { + if (interpolate) { + time += Time.delta; + + while (time >= Time.fixedStep) { + time -= Time.fixedStep; + } + + var t: Float = time / Time.fixedStep; + t = Helper.clamp(t, 0, 1); + + var tx: Float = prevPos.x() * (1.0 - t) + currentPos.x() * t; + var ty: Float = prevPos.y() * (1.0 - t) + currentPos.y() * t; + var tz: Float = prevPos.z() * (1.0 - t) + currentPos.z() * t; + + var tRot: bullet.Bt.Quaternion = nlerp(prevRot, currentRot, t); + + transform.loc.set(tx, ty, tz, 1.0); + transform.rot.set(tRot.x(), tRot.y(), tRot.z(), tRot.w()); + } else { + transform.loc.set(currentPos.x(), currentPos.y(), currentPos.z(), 1.0); + transform.rot.set(currentRot.x(), currentRot.y(), currentRot.z(), currentRot.w()); + } + + if (object.parent != null) { + var ptransform = object.parent.transform; + transform.loc.x -= ptransform.worldx(); + transform.loc.y -= ptransform.worldy(); + transform.loc.z -= ptransform.worldz(); + } + + transform.buildMatrix(); + } + + function nlerp(q1: bullet.Bt.Quaternion, q2: bullet.Bt.Quaternion, t: Float): bullet.Bt.Quaternion { + var dot = q1.x() * q2.x() + q1.y() * q2.y() + q1.z() * q2.z() + q1.w() * q2.w(); + var _q2 = dot < 0 ? new bullet.Bt.Quaternion(-q2.x(), -q2.y(), -q2.z(), -q2.w()) : q2; + + var x = q1.x() * (1.0 - t) + _q2.x() * t; + var y = q1.y() * (1.0 - t) + _q2.y() * t; + var z = q1.z() * (1.0 - t) + _q2.z() * t; + var w = q1.w() * (1.0 - t) + _q2.w() * t; + + var len = Math.sqrt(x * x + y * y + z * z + w * w); + return new bullet.Bt.Quaternion(x / len, y / len, z / len, w / len); + } + function physicsUpdate() { if (!ready) return; if (animated) { syncTransform(); - } - else { + } else { + if (interpolate) { + prevPos.setValue(currentPos.x(), currentPos.y(), currentPos.z()); + prevRot.setValue(currentRot.x(), currentRot.y(), currentRot.z(), currentRot.w()); + } var trans = body.getWorldTransform(); var p = trans.getOrigin(); var q = trans.getRotation(); - - transform.loc.set(p.x(), p.y(), p.z()); - transform.rot.set(q.x(), q.y(), q.z(), q.w()); - if (object.parent != null) { - var ptransform = object.parent.transform; - transform.loc.x -= ptransform.worldx(); - transform.loc.y -= ptransform.worldy(); - transform.loc.z -= ptransform.worldz(); - } transform.clearDelta(); - transform.buildMatrix(); + // transform.buildMatrix(); + currentPos.setValue(p.x(), p.y(), p.z()); + currentRot.setValue(q.x(), q.y(), q.z(), q.w()); + #if hl p.delete(); @@ -690,6 +751,7 @@ typedef RigidBodyFlags = { var animated: Bool; var trigger: Bool; var ccd: Bool; + var interpolate: Bool; var staticObj: Bool; var useDeactivation: Bool; } From 421463a64216a9eb4b9241197c8f2c15d3a673ee Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 04:11:02 +0000 Subject: [PATCH 26/92] moisesjpelaez - Physics Improvements --- leenkx/Sources/iron/App.hx | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/leenkx/Sources/iron/App.hx b/leenkx/Sources/iron/App.hx index eb4f653e..676932cd 100644 --- a/leenkx/Sources/iron/App.hx +++ b/leenkx/Sources/iron/App.hx @@ -37,7 +37,7 @@ class App { function new(done: Void->Void) { done(); kha.System.notifyOnFrames(render); - kha.Scheduler.addTimeTask(update, 0, iron.system.Time.delta); + kha.Scheduler.addTimeTask(update, 0, iron.system.Time.step); } public static function reset() { @@ -53,6 +53,8 @@ class App { static function update() { if (Scene.active == null || !Scene.active.ready) return; if (pauseUpdates) return; + + iron.system.Time.update(); #if lnx_debug startTime = kha.Scheduler.realTime(); @@ -60,6 +62,14 @@ class App { Scene.active.updateFrame(); + + time += iron.system.Time.delta; + + while (time >= iron.system.Time.fixedStep) { + for (f in traitFixedUpdates) f(); + time -= iron.system.Time.fixedStep; + } + var i = 0; var l = traitUpdates.length; while (i < l) { @@ -81,13 +91,6 @@ class App { l <= traitLateUpdates.length ? i++ : l = traitLateUpdates.length; } - time += iron.system.Time.realTime() - last; - last = iron.system.Time.realTime(); - while (time >= iron.system.Time.fixedStep) { - for (f in traitFixedUpdates) f(); - time -= iron.system.Time.fixedStep; - } - if (onEndFrames != null) for (f in onEndFrames) f(); #if lnx_debug @@ -117,7 +120,7 @@ class App { var frame = frames[0]; framebuffer = frame; - iron.system.Time.update(); + iron.system.Time.render(); if (Scene.active == null || !Scene.active.ready) { render2D(frame); From 26a10020ace5b6a933cf63004b4d0db1c0728846 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 04:12:58 +0000 Subject: [PATCH 27/92] moisesjpelaez - Physics Improvements --- leenkx/Sources/iron/object/Object.hx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/leenkx/Sources/iron/object/Object.hx b/leenkx/Sources/iron/object/Object.hx index 8a68e828..4c4987b7 100644 --- a/leenkx/Sources/iron/object/Object.hx +++ b/leenkx/Sources/iron/object/Object.hx @@ -172,6 +172,10 @@ class Object { for (f in t._init) App.removeInit(f); t._init = null; } + if (t._fixedUpdate != null) { + for (f in t._fixedUpdate) App.removeFixedUpdate(f); + t._fixedUpdate = null; + } if (t._update != null) { for (f in t._update) App.removeUpdate(f); t._update = null; From 00369aa90b3208cce99b1452cee090f9a8979e09 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 04:18:44 +0000 Subject: [PATCH 28/92] moisesjpelaez - Physics Improvements --- leenkx/Sources/iron/system/Time.hx | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/leenkx/Sources/iron/system/Time.hx b/leenkx/Sources/iron/system/Time.hx index 7b6cd221..99484ebd 100644 --- a/leenkx/Sources/iron/system/Time.hx +++ b/leenkx/Sources/iron/system/Time.hx @@ -8,21 +8,23 @@ class Time { return 1 / frequency; } - // TODO: set physics step from Blender's editor + static var _fixedStep: Null; public static var fixedStep(get, never): Float; static function get_fixedStep(): Float { - return 1 / 60; + return _fixedStep; } - public static var scale = 1.0; - public static var delta(get, never): Float; - static function get_delta(): Float { - if (frequency == null) initFrequency(); - return (1 / frequency) * scale; + + public static function initFixedStep(value: Float = 1 / 60) { + _fixedStep = value; } - static var last = 0.0; - public static var realDelta = 0.0; + + static var lastTime = 0.0; + public static var delta = 0.0; + + static var lastRenderTime = 0.0; + public static var renderDelta = 0.0; public static inline function time(): Float { return kha.Scheduler.time(); } @@ -37,7 +39,12 @@ class Time { } public static function update() { - realDelta = realTime() - last; - last = realTime(); + delta = (realTime() - lastTime) * scale; + lastTime = realTime(); + } + + public static function render() { + renderDelta = (realTime() - lastRenderTime) * scale; + lastRenderTime = realTime(); } } From 8b187940eec82e076937cf3656a148a371b46bc0 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 06:22:23 +0000 Subject: [PATCH 29/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/exporter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/exporter.py b/leenkx/blender/lnx/exporter.py index c1b5f3d9..c35de792 100644 --- a/leenkx/blender/lnx/exporter.py +++ b/leenkx/blender/lnx/exporter.py @@ -2815,6 +2815,7 @@ class LeenkxExporter: body_flags['animated'] = rb.kinematic body_flags['trigger'] = bobject.lnx_rb_trigger body_flags['ccd'] = bobject.lnx_rb_ccd + body_flags['interpolate'] = bobject.lnx_rb_interpolate body_flags['staticObj'] = is_static body_flags['useDeactivation'] = rb.use_deactivation x['parameters'].append(lnx.utils.get_haxe_json_string(body_params)) @@ -3039,7 +3040,7 @@ class LeenkxExporter: rbw = self.scene.rigidbody_world if rbw is not None and rbw.enabled: - out_trait['parameters'] = [str(rbw.time_scale), str(rbw.substeps_per_frame), str(rbw.solver_iterations)] + out_trait['parameters'] = [str(rbw.time_scale), str(rbw.substeps_per_frame), str(rbw.solver_iterations), str(wrd.lnx_physics_fixed_step)] if phys_pkg == 'bullet' or phys_pkg == 'oimo': debug_draw_mode = 1 if wrd.lnx_physics_dbg_draw_wireframe else 0 From 2fca73aebd2d680d5789693922a518ef80589919 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 06:26:11 +0000 Subject: [PATCH 30/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/props.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/leenkx/blender/lnx/props.py b/leenkx/blender/lnx/props.py index 4a5a6666..211c2730 100644 --- a/leenkx/blender/lnx/props.py +++ b/leenkx/blender/lnx/props.py @@ -197,6 +197,10 @@ def init_properties(): items=[('Bullet', 'Bullet', 'Bullet'), ('Oimo', 'Oimo', 'Oimo')], name="Physics Engine", default='Bullet', update=assets.invalidate_compiler_cache) + bpy.types.World.lnx_physics_fixed_step = FloatProperty( + name="Fixed Step", default=1/60, min=0, max=1, + description="Physics steps for fixed update" + ) bpy.types.World.lnx_physics_dbg_draw_wireframe = BoolProperty( name="Collider Wireframes", default=False, description="Draw wireframes of the physics collider meshes and suspensions of raycast vehicle simulations" @@ -357,6 +361,7 @@ def init_properties(): bpy.types.Object.lnx_rb_trigger = BoolProperty(name="Trigger", description="Disable contact response", default=False) bpy.types.Object.lnx_rb_deactivation_time = FloatProperty(name="Deactivation Time", description="Delay putting rigid body into sleep", default=0.0) bpy.types.Object.lnx_rb_ccd = BoolProperty(name="Continuous Collision Detection", description="Improve collision for fast moving objects", default=False) + bpy.types.Object.lnx_rb_interpolate = BoolProperty(name="Interpolation", description="Smooths out the object's transform on physics steps", default=False) bpy.types.Object.lnx_rb_collision_filter_mask = bpy.props.BoolVectorProperty( name="Collision Collections Filter Mask", description="Collision collections rigid body interacts with", From 85bbc10d06eaa3220e734a26892b6741660cba8b Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 06:31:14 +0000 Subject: [PATCH 31/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/handlers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/blender/lnx/handlers.py b/leenkx/blender/lnx/handlers.py index 80cbdb53..ef475894 100644 --- a/leenkx/blender/lnx/handlers.py +++ b/leenkx/blender/lnx/handlers.py @@ -87,6 +87,7 @@ def on_operator_post(operator_id: str) -> None: target_obj.lnx_rb_trigger = source_obj.lnx_rb_trigger target_obj.lnx_rb_deactivation_time = source_obj.lnx_rb_deactivation_time target_obj.lnx_rb_ccd = source_obj.lnx_rb_ccd + target_obj.lnx_rb_interpolate = source_obj.lnx_rb_interpolate target_obj.lnx_rb_collision_filter_mask = source_obj.lnx_rb_collision_filter_mask elif operator_id == "NODE_OT_new_node_tree": From d0b3dc2ff8fea15c5f4268c0e3c1026c2c724f68 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 07:24:53 +0000 Subject: [PATCH 32/92] moisesjpelaez - Physics Improvements --- leenkx/blender/lnx/props_ui.py | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index 7624fe8d..6811a92d 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -242,6 +242,7 @@ class LNX_PT_PhysicsPropsPanel(bpy.types.Panel): layout.prop(obj, 'lnx_rb_angular_friction') layout.prop(obj, 'lnx_rb_trigger') layout.prop(obj, 'lnx_rb_ccd') + layout.prop(obj, 'lnx_rb_interpolate') if obj.soft_body is not None: layout.prop(obj, 'lnx_soft_body_margin') @@ -2732,8 +2733,33 @@ class LeenkxUpdateListInstalledVSButton(bpy.types.Operator): return {'FINISHED'} +class LNX_PT_PhysicsProps(bpy.types.Panel): + bl_label = "Leenkx Props" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "scene" + bl_options = {'DEFAULT_CLOSED'} + bl_parent_id = "SCENE_PT_rigid_body_world" -class LNX_PT_BulletDebugDrawingPanel(bpy.types.Panel): + @classmethod + def poll(cls, context): + return context.scene.rigidbody_world is not None + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False + wrd = bpy.data.worlds['Lnx'] + + if wrd.lnx_physics_engine != 'Bullet' and wrd.lnx_physics_engine != 'Oimo': + row = layout.row() + row.alert = True + row.label(text="Physics debug drawing is only supported for the Bullet and Oimo physics engines") + + col = layout.column(align=False) + col.prop(wrd, "lnx_physics_fixed_step") + +class LNX_PT_PhysicsDebugDrawingPanel(bpy.types.Panel): bl_label = "Leenkx Debug Drawing" bl_space_type = "PROPERTIES" bl_region_type = "WINDOW" @@ -2899,7 +2925,8 @@ __REG_CLASSES = ( LeenkxUpdateListAndroidEmulatorButton, LeenkxUpdateListAndroidEmulatorRunButton, LeenkxUpdateListInstalledVSButton, - LNX_PT_BulletDebugDrawingPanel, + LNX_PT_PhysicsProps, + LNX_PT_PhysicsDebugDrawingPanel, LNX_OT_AddArmatureRootMotion, scene.TLM_PT_Settings, scene.TLM_PT_Denoise, From ea12d5b95141d54c6b054ad69dfc59c6fef01c9d Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 16:21:25 +0000 Subject: [PATCH 33/92] moisesjpelaez - Fix pausing and resuming updates --- leenkx/Sources/iron/App.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/Sources/iron/App.hx b/leenkx/Sources/iron/App.hx index 676932cd..11411878 100644 --- a/leenkx/Sources/iron/App.hx +++ b/leenkx/Sources/iron/App.hx @@ -52,9 +52,9 @@ class App { static function update() { if (Scene.active == null || !Scene.active.ready) return; - if (pauseUpdates) return; iron.system.Time.update(); + if (pauseUpdates) return; #if lnx_debug startTime = kha.Scheduler.realTime(); From 7f5786d47c5f18df470a8ec616cfd8eb8a9a7be9 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 16:24:22 +0000 Subject: [PATCH 34/92] moisesjpelaez - Fix pausing and resuming updates --- leenkx/Sources/iron/object/ParticleSystem.hx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/iron/object/ParticleSystem.hx b/leenkx/Sources/iron/object/ParticleSystem.hx index baeabac4..a6b03da0 100644 --- a/leenkx/Sources/iron/object/ParticleSystem.hx +++ b/leenkx/Sources/iron/object/ParticleSystem.hx @@ -22,10 +22,10 @@ class ParticleSystem { var ready: Bool; var frameRate = 24; var lifetime = 0.0; + var looptime = 0.0; var animtime = 0.0; var time = 0.0; var spawnRate = 0.0; - var looptime = 0.0; var seed = 0; var r: TParticleData; @@ -124,7 +124,8 @@ class ParticleSystem { public function update(object: MeshObject, owner: MeshObject) { if (!ready || object == null || speed == 0.0) return; - + if (iron.App.pauseUpdates) return; + var prevLap = lap; // Copy owner world transform but discard scale From ae91f8801fad533123b3e3d2c1449e456f2eb2bf Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 16:32:28 +0000 Subject: [PATCH 35/92] moisesjpelaez - Fix pausing and resuming updates --- leenkx/Sources/iron/system/Time.hx | 36 ++++++++++++++++++------------ 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/leenkx/Sources/iron/system/Time.hx b/leenkx/Sources/iron/system/Time.hx index 99484ebd..1ebc077c 100644 --- a/leenkx/Sources/iron/system/Time.hx +++ b/leenkx/Sources/iron/system/Time.hx @@ -1,7 +1,13 @@ package iron.system; class Time { - + public static var scale = 1.0; + + static var frequency: Null = null; + static function initFrequency() { + frequency = kha.Display.primary != null ? kha.Display.primary.frequency : 60; + } + public static var step(get, never): Float; static function get_step(): Float { if (frequency == null) initFrequency(); @@ -14,37 +20,39 @@ class Time { return _fixedStep; } - public static function initFixedStep(value: Float = 1 / 60) { _fixedStep = value; } - static var lastTime = 0.0; - public static var delta = 0.0; - + static var _delta = 0.0; + public static var delta(get, never): Float; + static function get_delta(): Float { + return _delta; + } + static var lastRenderTime = 0.0; - public static var renderDelta = 0.0; + static var _renderDelta = 0.0; + public static var renderDelta(get, never): Float; + static function get_renderDelta(): Float { + return _renderDelta; + } + public static inline function time(): Float { return kha.Scheduler.time(); } + public static inline function realTime(): Float { return kha.Scheduler.realTime(); } - static var frequency: Null = null; - - static function initFrequency() { - frequency = kha.Display.primary != null ? kha.Display.primary.frequency : 60; - } - public static function update() { - delta = (realTime() - lastTime) * scale; + _delta = realTime() - lastTime; lastTime = realTime(); } public static function render() { - renderDelta = (realTime() - lastRenderTime) * scale; + _renderDelta = realTime() - lastRenderTime; lastRenderTime = realTime(); } } From 59df400b0d8d7650f3ee14c2038594c37a1f63af Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 16:44:08 +0000 Subject: [PATCH 36/92] t3du - Ies Texture and Cloud Texture: improvements --- leenkx/blender/lnx/make_renderpath.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/make_renderpath.py b/leenkx/blender/lnx/make_renderpath.py index 4c8c3be2..c3c6cbe4 100644 --- a/leenkx/blender/lnx/make_renderpath.py +++ b/leenkx/blender/lnx/make_renderpath.py @@ -40,11 +40,11 @@ def add_world_defs(): if rpdat.rp_hdr == False: wrd.world_defs += '_LDR' - if wrd.lnx_light_ies_texture != '': + if lnx.utils.get_active_scene().world.lnx_light_ies_texture == True: wrd.world_defs += '_LightIES' assets.add_embedded_data('iestexture.png') - if wrd.lnx_light_clouds_texture != '': + if lnx.utils.get_active_scene().world.lnx_light_clouds_texture == True: wrd.world_defs += '_LightClouds' assets.add_embedded_data('cloudstexture.png') From 1b855f953f32b98980c0ec097e92da181b059ddf Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 16:46:01 +0000 Subject: [PATCH 37/92] t3du - Ies Texture and Cloud Texture: improvements --- leenkx/blender/lnx/props.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/props.py b/leenkx/blender/lnx/props.py index 211c2730..04cd05c4 100644 --- a/leenkx/blender/lnx/props.py +++ b/leenkx/blender/lnx/props.py @@ -510,8 +510,9 @@ def init_properties(): bpy.types.Light.lnx_clip_end = FloatProperty(name="Clip End", default=50.0) bpy.types.Light.lnx_fov = FloatProperty(name="Field of View", default=0.84) bpy.types.Light.lnx_shadows_bias = FloatProperty(name="Bias", description="Depth offset to fight shadow acne", default=1.0) - bpy.types.World.lnx_light_ies_texture = StringProperty(name="IES Texture", default="") - bpy.types.World.lnx_light_clouds_texture = StringProperty(name="Clouds Texture", default="") + # For world + bpy.types.World.lnx_light_ies_texture = BoolProperty(name="IES Texture (iestexture.png)", default=False, update=assets.invalidate_compiler_cache) + bpy.types.World.lnx_light_clouds_texture = BoolProperty(name="Clouds Texture (cloudstexture.png)", default=False, update=assets.invalidate_compiler_cache) bpy.types.World.lnx_rpcache_list = CollectionProperty(type=bpy.types.PropertyGroup) bpy.types.World.lnx_scripts_list = CollectionProperty(type=bpy.types.PropertyGroup) From eede86e278fa70cee7867d7f5f80c2a887272eb6 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 16:47:43 +0000 Subject: [PATCH 38/92] Update leenkx/blender/lnx/props_ui.py --- leenkx/blender/lnx/props_ui.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index 6811a92d..a13e45e7 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -306,8 +306,6 @@ class LNX_PT_DataPropsPanel(bpy.types.Panel): layout.prop(obj.data, 'lnx_clip_end') layout.prop(obj.data, 'lnx_fov') layout.prop(obj.data, 'lnx_shadows_bias') - layout.prop(wrd, 'lnx_light_ies_texture') - layout.prop(wrd, 'lnx_light_clouds_texture') elif obj.type == 'SPEAKER': layout.prop(obj.data, 'lnx_play_on_start') layout.prop(obj.data, 'lnx_loop') @@ -335,6 +333,8 @@ class LNX_PT_WorldPropsPanel(bpy.types.Panel): if world is None: return + layout.prop(world, 'lnx_light_ies_texture') + layout.prop(world, 'lnx_light_clouds_texture') layout.prop(world, 'lnx_use_clouds') col = layout.column(align=True) col.enabled = world.lnx_use_clouds From 32df55d63615692eee7eb14d5815f311d616cdcc Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:00:57 +0000 Subject: [PATCH 39/92] t3du - CA Updates --- .../chromatic_aberration_pass.frag.glsl | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/leenkx/Shaders/chromatic_aberration_pass/chromatic_aberration_pass.frag.glsl b/leenkx/Shaders/chromatic_aberration_pass/chromatic_aberration_pass.frag.glsl index 176b8868..97b12d2a 100644 --- a/leenkx/Shaders/chromatic_aberration_pass/chromatic_aberration_pass.frag.glsl +++ b/leenkx/Shaders/chromatic_aberration_pass/chromatic_aberration_pass.frag.glsl @@ -5,7 +5,7 @@ uniform sampler2D tex; #ifdef _CPostprocess -uniform vec3 PPComp13; +uniform vec4 PPComp13; #endif in vec2 texCoord; @@ -43,13 +43,17 @@ void main() { #ifdef _CPostprocess float max_distort = PPComp13.x; int num_iter = int(PPComp13.y); + int CAType = int(PPComp13.z); + int on = int(PPComp13.w); #else float max_distort = compoChromaticStrength; int num_iter = compoChromaticSamples; + int CAType = compoChromaticType; + int on = 1; #endif // Spectral - if (compoChromaticType == 1) { + if (CAType == 1) { float reci_num_iter_f = 1.0 / float(num_iter); vec2 resolution = vec2(1,1); @@ -64,7 +68,7 @@ void main() { sumcol += w * texture(tex, barrelDistortion(uv, 0.6 * max_distort * t)); } - fragColor = sumcol / sumw; + if (on == 1) fragColor = sumcol / sumw; else fragColor = texture(tex, texCoord); } // Simple @@ -73,6 +77,7 @@ void main() { col.x = texture(tex, texCoord + ((vec2(0.0, 1.0) * max_distort) / vec2(1000.0))).x; col.y = texture(tex, texCoord + ((vec2(-0.85, -0.5) * max_distort) / vec2(1000.0))).y; col.z = texture(tex, texCoord + ((vec2(0.85, -0.5) * max_distort) / vec2(1000.0))).z; - fragColor = vec4(col.x, col.y, col.z, fragColor.w); + if (on == 1) fragColor = vec4(col.x, col.y, col.z, fragColor.w); + else fragColor = texture(tex, texCoord); } } From 80d4422c9096fc45a343a12d0c8dcbff880c8afe Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:03:41 +0000 Subject: [PATCH 40/92] t3du - CA Updates --- leenkx/Sources/leenkx/data/Config.hx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/data/Config.hx b/leenkx/Sources/leenkx/data/Config.hx index 44b9976d..157a3ee4 100644 --- a/leenkx/Sources/leenkx/data/Config.hx +++ b/leenkx/Sources/leenkx/data/Config.hx @@ -17,7 +17,7 @@ class Config { } public static function save() { - var path = iron.data.Data.dataPath + "config.lnx"; + var path = iron.data.Data.dataPath != '' ? iron.data.Data.dataPath + "config.lnx" : Krom.getFilesLocation() + "/config.lnx"; var bytes = haxe.io.Bytes.ofString(haxe.Json.stringify(raw)); #if kha_krom Krom.fileSaveBytes(path, bytes.getData()); @@ -47,6 +47,7 @@ typedef TConfig = { @:optional var rp_ssr: Null; @:optional var rp_ssrefr: Null; @:optional var rp_bloom: Null; + @:optional var rp_chromatic_aberration: Null; @:optional var rp_motionblur: Null; @:optional var rp_gi: Null; // voxelao @:optional var rp_dynres: Null; // dynamic resolution scaling From 78592b245fa953f8d861838598ade2321d5a9356 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:04:55 +0000 Subject: [PATCH 41/92] t3du - CA Updates --- leenkx/Sources/leenkx/logicnode/ChromaticAberrationGetNode.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/Sources/leenkx/logicnode/ChromaticAberrationGetNode.hx b/leenkx/Sources/leenkx/logicnode/ChromaticAberrationGetNode.hx index 3a02f2e9..f29a024d 100644 --- a/leenkx/Sources/leenkx/logicnode/ChromaticAberrationGetNode.hx +++ b/leenkx/Sources/leenkx/logicnode/ChromaticAberrationGetNode.hx @@ -10,6 +10,7 @@ class ChromaticAberrationGetNode extends LogicNode { return switch (from) { case 0: leenkx.renderpath.Postprocess.chromatic_aberration_uniforms[0]; case 1: leenkx.renderpath.Postprocess.chromatic_aberration_uniforms[1]; + case 2: leenkx.renderpath.Postprocess.chromatic_aberration_uniforms[2]; default: 0.0; } } From 6c3d71c4c9e979cf926c8c425c20ce9f63335980 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:05:30 +0000 Subject: [PATCH 42/92] t3du - CA Updates --- leenkx/Sources/leenkx/logicnode/ChromaticAberrationSetNode.hx | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/Sources/leenkx/logicnode/ChromaticAberrationSetNode.hx b/leenkx/Sources/leenkx/logicnode/ChromaticAberrationSetNode.hx index e88dea79..d878a16c 100644 --- a/leenkx/Sources/leenkx/logicnode/ChromaticAberrationSetNode.hx +++ b/leenkx/Sources/leenkx/logicnode/ChromaticAberrationSetNode.hx @@ -10,6 +10,7 @@ class ChromaticAberrationSetNode extends LogicNode { leenkx.renderpath.Postprocess.chromatic_aberration_uniforms[0] = inputs[1].get(); leenkx.renderpath.Postprocess.chromatic_aberration_uniforms[1] = inputs[2].get(); + leenkx.renderpath.Postprocess.chromatic_aberration_uniforms[2] = inputs[3].get(); runOutput(0); } From 6e02aeee53f9685e2aba21378a71aabd5f874bb7 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:06:56 +0000 Subject: [PATCH 43/92] t3du - CA Updates --- leenkx/Sources/leenkx/logicnode/RpConfigNode.hx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leenkx/Sources/leenkx/logicnode/RpConfigNode.hx b/leenkx/Sources/leenkx/logicnode/RpConfigNode.hx index 565244a4..a6083a45 100644 --- a/leenkx/Sources/leenkx/logicnode/RpConfigNode.hx +++ b/leenkx/Sources/leenkx/logicnode/RpConfigNode.hx @@ -20,6 +20,8 @@ class RpConfigNode extends LogicNode { on ? leenkx.data.Config.raw.rp_ssrefr = true : leenkx.data.Config.raw.rp_ssrefr = false; case "Bloom": on ? leenkx.data.Config.raw.rp_bloom = true : leenkx.data.Config.raw.rp_bloom = false; + case "CA": + on ? leenkx.data.Config.raw.rp_chromatic_aberration = true : leenkx.data.Config.raw.rp_chromatic_aberration = false; case "GI": on ? leenkx.data.Config.raw.rp_gi = true : leenkx.data.Config.raw.rp_gi = false; case "Motion Blur": From 0199ee987785e973db4f11930ce0b4b31211420f Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:09:28 +0000 Subject: [PATCH 44/92] t3du - CA Updates --- leenkx/Sources/leenkx/renderpath/Inc.hx | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/leenkx/Sources/leenkx/renderpath/Inc.hx b/leenkx/Sources/leenkx/renderpath/Inc.hx index 345a25bd..8f15a4f0 100644 --- a/leenkx/Sources/leenkx/renderpath/Inc.hx +++ b/leenkx/Sources/leenkx/renderpath/Inc.hx @@ -529,15 +529,21 @@ class Inc { public static function applyConfig() { #if lnx_config var config = leenkx.data.Config.raw; + + #if rp_chromatic_aberration + Postprocess.chromatic_aberration_uniforms[3] = config.rp_chromatic_aberration == true ? 1 : 0; + #end + // Resize shadow map var l = path.light; - if (l.data.raw.type == "sun" && l.data.raw.shadowmap_size != config.rp_shadowmap_cascade) { - l.data.raw.shadowmap_size = config.rp_shadowmap_cascade; - var rt = path.renderTargets.get("shadowMap"); - if (rt != null) { - rt.unload(); - path.renderTargets.remove("shadowMap"); - } + if (l != null){ + if (l.data.raw.type == "sun" && l.data.raw.shadowmap_size != config.rp_shadowmap_cascade) { + l.data.raw.shadowmap_size = config.rp_shadowmap_cascade; + var rt = path.renderTargets.get("shadowMap"); + if (rt != null) { + rt.unload(); + path.renderTargets.remove("shadowMap"); + } } else if (l.data.raw.shadowmap_size != config.rp_shadowmap_cube) { l.data.raw.shadowmap_size = config.rp_shadowmap_cube; From 114bf7544ad794913884592ce377d2f7e3dbf0be Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:14:44 +0000 Subject: [PATCH 45/92] t3du - CA Updates --- leenkx/Sources/leenkx/renderpath/Inc.hx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/leenkx/Sources/leenkx/renderpath/Inc.hx b/leenkx/Sources/leenkx/renderpath/Inc.hx index 8f15a4f0..b27d4adb 100644 --- a/leenkx/Sources/leenkx/renderpath/Inc.hx +++ b/leenkx/Sources/leenkx/renderpath/Inc.hx @@ -544,13 +544,14 @@ class Inc { rt.unload(); path.renderTargets.remove("shadowMap"); } - } - else if (l.data.raw.shadowmap_size != config.rp_shadowmap_cube) { - l.data.raw.shadowmap_size = config.rp_shadowmap_cube; - var rt = path.renderTargets.get("shadowMapCube"); - if (rt != null) { - rt.unload(); - path.renderTargets.remove("shadowMapCube"); + } + else if (l.data.raw.shadowmap_size != config.rp_shadowmap_cube) { + l.data.raw.shadowmap_size = config.rp_shadowmap_cube; + var rt = path.renderTargets.get("shadowMapCube"); + if (rt != null) { + rt.unload(); + path.renderTargets.remove("shadowMapCube"); + } } } if (superSample != config.rp_supersample) { From 10503377513e126fae7942c13949e95030dda4b8 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:20:59 +0000 Subject: [PATCH 46/92] t3du - CA Updates --- leenkx/Sources/leenkx/renderpath/Postprocess.hx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/leenkx/Sources/leenkx/renderpath/Postprocess.hx b/leenkx/Sources/leenkx/renderpath/Postprocess.hx index 4886a432..49f52fc1 100644 --- a/leenkx/Sources/leenkx/renderpath/Postprocess.hx +++ b/leenkx/Sources/leenkx/renderpath/Postprocess.hx @@ -102,7 +102,9 @@ class Postprocess { public static var chromatic_aberration_uniforms = [ 2.0, //0: Strength - 32 //1: Samples + 32, //1: Samples + 0, //2: Type + 1 //3: On/Off ]; public static function vec3Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 { @@ -308,7 +310,8 @@ class Postprocess { v = iron.object.Uniforms.helpVec; v.x = chromatic_aberration_uniforms[0]; //CA Strength v.y = chromatic_aberration_uniforms[1]; //CA Samples - v.z = 0; + v.z = chromatic_aberration_uniforms[2]; //CA Type + v.w = chromatic_aberration_uniforms[3]; //On/Off case "_PPComp14": v = iron.object.Uniforms.helpVec; v.x = camera_uniforms[10]; //Distort From 385c683fe32f3b2a3626c8cab3d31ee39f87cf9f Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:25:33 +0000 Subject: [PATCH 47/92] t3du - CA Updates --- .../lnx/logicnode/postprocess/LN_get_ca_settings.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_ca_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_ca_settings.py index f1d8c1fc..51f0b089 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_get_ca_settings.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_ca_settings.py @@ -1,11 +1,20 @@ from lnx.logicnode.lnx_nodes import * class ChromaticAberrationGetNode(LnxLogicTreeNode): - """Returns the chromatic aberration post-processing settings.""" + """Returns the chromatic aberration post-processing settings. + Type: Simple 0 Spectral 1. + """ bl_idname = 'LNChromaticAberrationGetNode' bl_label = 'Get CA Settings' - lnx_version = 1 + lnx_version = 2 def lnx_init(self, context): self.add_output('LnxFloatSocket', 'Strength') self.add_output('LnxFloatSocket', 'Samples') + self.add_output('LnxIntSocket', 'Type') + + def get_replacement_node(self, node_tree: bpy.types.NodeTree): + if self.lnx_version not in (0, 1): + raise LookupError() + + return NodeReplacement.Identity(self) \ No newline at end of file From c958113c94a1a8559075d4076b3c6fef5a7413ec Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:27:27 +0000 Subject: [PATCH 48/92] Update leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py --- .../lnx/logicnode/postprocess/LN_set_ca_settings.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py index 534fa7c9..1ec6a7dd 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py @@ -1,7 +1,9 @@ from lnx.logicnode.lnx_nodes import * class ChromaticAberrationSetNode(LnxLogicTreeNode): - """Set the chromatic aberration post-processing settings.""" + """Set the chromatic aberration post-processing settings. + Type: Simple 0 Spectral 1. + """ bl_idname = 'LNChromaticAberrationSetNode' bl_label = 'Set CA Settings' lnx_version = 1 @@ -9,6 +11,12 @@ class ChromaticAberrationSetNode(LnxLogicTreeNode): def lnx_init(self, context): self.add_input('LnxNodeSocketAction', 'In') self.add_input('LnxFloatSocket', 'Strength', default_value=2.0) - self.add_input('LnxIntSocket', 'Samples', default_value=32) + self.add_input('LnxIntSocket', 'Type', default_value=0) self.add_output('LnxNodeSocketAction', 'Out') + + def get_replacement_node(self, node_tree: bpy.types.NodeTree): + if self.lnx_version not in (0, 1): + raise LookupError() + + return NodeReplacement.Identity(self) \ No newline at end of file From a3930d7761d6c203f15e828040708d716685abc8 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:31:13 +0000 Subject: [PATCH 49/92] t3du - CA Updates --- .../renderpath/LN_set_post_process_quality.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/logicnode/renderpath/LN_set_post_process_quality.py b/leenkx/blender/lnx/logicnode/renderpath/LN_set_post_process_quality.py index 49751281..4697aa9f 100644 --- a/leenkx/blender/lnx/logicnode/renderpath/LN_set_post_process_quality.py +++ b/leenkx/blender/lnx/logicnode/renderpath/LN_set_post_process_quality.py @@ -4,12 +4,13 @@ class RpConfigNode(LnxLogicTreeNode): """Sets the post process quality.""" bl_idname = 'LNRpConfigNode' bl_label = 'Set Post Process Quality' - lnx_version = 1 + lnx_version = 2 property0: HaxeEnumProperty( 'property0', items = [('SSGI', 'SSGI', 'SSGI'), ('SSR', 'SSR', 'SSR'), ('Bloom', 'Bloom', 'Bloom'), + ('CA', 'CA', 'CA'), ('GI', 'GI', 'GI'), ('Motion Blur', 'Motion Blur', 'Motion Blur') ], @@ -23,3 +24,10 @@ class RpConfigNode(LnxLogicTreeNode): def draw_buttons(self, context, layout): layout.prop(self, 'property0') + + + def get_replacement_node(self, node_tree: bpy.types.NodeTree): + if self.lnx_version not in (0, 1): + raise LookupError() + + return NodeReplacement.Identity(self) \ No newline at end of file From 9d78aabf35d12c60d9da1087e0284e336bc06c66 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:33:15 +0000 Subject: [PATCH 50/92] t3du - CA Updates --- leenkx/blender/lnx/write_data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/blender/lnx/write_data.py b/leenkx/blender/lnx/write_data.py index 117be1d0..5a4f94f3 100644 --- a/leenkx/blender/lnx/write_data.py +++ b/leenkx/blender/lnx/write_data.py @@ -451,6 +451,7 @@ def write_config(resx, resy): 'rp_ssr': rpdat.rp_ssr != 'Off', 'rp_ss_refraction': rpdat.rp_ss_refraction != 'Off', 'rp_bloom': rpdat.rp_bloom != 'Off', + 'rp_chromatic_aberration': rpdat.rp_chromatic_aberration != 'Off', 'rp_motionblur': rpdat.rp_motionblur != 'Off', 'rp_gi': rpdat.rp_voxels != "Off", 'rp_dynres': rpdat.rp_dynres From b0e624ef757608d3eadb7c0acdaaff515bb396e9 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:34:59 +0000 Subject: [PATCH 51/92] t3du - CA Updates --- leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py index 1ec6a7dd..d5b5301b 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py @@ -11,6 +11,7 @@ class ChromaticAberrationSetNode(LnxLogicTreeNode): def lnx_init(self, context): self.add_input('LnxNodeSocketAction', 'In') self.add_input('LnxFloatSocket', 'Strength', default_value=2.0) + self.add_input('LnxIntSocket', 'Samples', default_value=32) self.add_input('LnxIntSocket', 'Type', default_value=0) self.add_output('LnxNodeSocketAction', 'Out') From 79422337aece24a9e8871c5cd7fbf364462fb3ed Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:35:46 +0000 Subject: [PATCH 52/92] t3du - CA Updates --- leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py index d5b5301b..3780f459 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_ca_settings.py @@ -6,7 +6,7 @@ class ChromaticAberrationSetNode(LnxLogicTreeNode): """ bl_idname = 'LNChromaticAberrationSetNode' bl_label = 'Set CA Settings' - lnx_version = 1 + lnx_version = 2 def lnx_init(self, context): self.add_input('LnxNodeSocketAction', 'In') From d76c29578652125ba644ab974c5452bbfd463ca1 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:48:09 +0000 Subject: [PATCH 53/92] t3du - Krom path condition --- leenkx/Sources/leenkx/data/Config.hx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/leenkx/Sources/leenkx/data/Config.hx b/leenkx/Sources/leenkx/data/Config.hx index 157a3ee4..569f369e 100644 --- a/leenkx/Sources/leenkx/data/Config.hx +++ b/leenkx/Sources/leenkx/data/Config.hx @@ -17,9 +17,10 @@ class Config { } public static function save() { - var path = iron.data.Data.dataPath != '' ? iron.data.Data.dataPath + "config.lnx" : Krom.getFilesLocation() + "/config.lnx"; + var path = iron.data.Data.dataPath + "config.lnx"; var bytes = haxe.io.Bytes.ofString(haxe.Json.stringify(raw)); #if kha_krom + if (iron.data.Data.dataPath == '') path = Krom.getFilesLocation() + "/config.lnx"; Krom.fileSaveBytes(path, bytes.getData()); #elseif kha_kore sys.io.File.saveBytes(path, bytes); From 3d91f2f1e7f6fc616961d1ea760d01d3d02605a9 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:54:31 +0000 Subject: [PATCH 54/92] t3du - Particle nodes Update --- .../leenkx/logicnode/GetParticleDataNode.hx | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx b/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx index bad5504e..5fdd8b36 100644 --- a/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx +++ b/leenkx/Sources/leenkx/logicnode/GetParticleDataNode.hx @@ -39,22 +39,28 @@ class GetParticleDataNode extends LogicNode { case 6: @:privateAccess psys.r.emit_from; case 7: - new iron.math.Vec3(@:privateAccess psys.alignx*2, @:privateAccess psys.aligny*2, @:privateAccess psys.alignz*2); + @:privateAccess psys.r.auto_start; case 8: - @:privateAccess psys.r.factor_random; + @:privateAccess psys.r.is_unique; case 9: - new iron.math.Vec3(@:privateAccess psys.gx, @:privateAccess psys.gy, @:privateAccess psys.gz); + @:privateAccess psys.r.loop; case 10: - @:privateAccess psys.r.weight_gravity; + new iron.math.Vec3(@:privateAccess psys.alignx, @:privateAccess psys.aligny, @:privateAccess psys.alignz); case 11: - psys.speed; + @:privateAccess psys.r.factor_random; case 12: - @:privateAccess psys.time; + new iron.math.Vec3(@:privateAccess psys.gx, @:privateAccess psys.gy, @:privateAccess psys.gz); case 13: - @:privateAccess psys.lap; + @:privateAccess psys.r.weight_gravity; case 14: - @:privateAccess psys.lapTime; + psys.speed; case 15: + @:privateAccess psys.time; + case 16: + @:privateAccess psys.lap; + case 17: + @:privateAccess psys.lapTime; + case 18: @:privateAccess psys.count; default: null; From d6a7b7e3057534e3141c2d73f1306547fed74dda Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 17:58:15 +0000 Subject: [PATCH 55/92] t3du - Particle nodes Update --- .../leenkx/logicnode/SetParticleDataNode.hx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx b/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx index 6b80f20e..ef67c506 100644 --- a/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx +++ b/leenkx/Sources/leenkx/logicnode/SetParticleDataNode.hx @@ -41,13 +41,19 @@ class SetParticleDataNode extends LogicNode { var emit_from: Int = inputs[3].get(); if (emit_from == 0 || emit_from == 1 || emit_from == 2) { @:privateAccess psys.r.emit_from = emit_from; - @:privateAccess psys.setupGeomGpu(mo.particleChildren != null ? mo.particleChildren[slot] : cast(iron.Scene.active.getChild(psys.data.raw.instance_object), iron.object.MeshObject), mo); + @:privateAccess psys.setupGeomGpu(mo.particleChildren != null ? mo.particleChildren[slot] : cast(iron.Scene.active.getChild(@:privateAccess psys.data.raw.instance_object), iron.object.MeshObject), mo); } + case 'Auto Start': + @:privateAccess psys.r.auto_start = inputs[3].get(); + case 'Is Unique': + @:privateAccess psys.r.is_unique = inputs[3].get(); + case 'Loop': + @:privateAccess psys.r.loop = inputs[3].get(); case 'Velocity': var vel: iron.math.Vec3 = inputs[3].get(); - @:privateAccess psys.alignx = vel.x / 2; - @:privateAccess psys.aligny = vel.y / 2; - @:privateAccess psys.alignz = vel.z / 2; + @:privateAccess psys.alignx = vel.x; + @:privateAccess psys.aligny = vel.y; + @:privateAccess psys.alignz = vel.z; case 'Velocity Random': psys.r.factor_random = inputs[3].get(); case 'Weight Gravity': From 0c5d71ecd2687baaac1d7e1d155fb91b2239ef6d Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:00:15 +0000 Subject: [PATCH 56/92] t3du - Particle nodes Update --- .../particle/LN_get_particle_data.py | 65 ++++++++++--------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/leenkx/blender/lnx/logicnode/particle/LN_get_particle_data.py b/leenkx/blender/lnx/logicnode/particle/LN_get_particle_data.py index 01ef6d00..3c3ebcf6 100644 --- a/leenkx/blender/lnx/logicnode/particle/LN_get_particle_data.py +++ b/leenkx/blender/lnx/logicnode/particle/LN_get_particle_data.py @@ -1,31 +1,34 @@ -from lnx.logicnode.lnx_nodes import * - -class GetParticleDataNode(LnxLogicTreeNode): - """Returns the data of the given Particle System.""" - bl_idname = 'LNGetParticleDataNode' - bl_label = 'Get Particle Data' - lnx_version = 1 - - def lnx_init(self, context): - self.inputs.new('LnxNodeSocketObject', 'Object') - self.inputs.new('LnxIntSocket', 'Slot') - - self.outputs.new('LnxStringSocket', 'Name') - self.outputs.new('LnxFloatSocket', 'Particle Size') - self.outputs.new('LnxIntSocket', 'Frame Start') - self.outputs.new('LnxIntSocket', 'Frame End') - self.outputs.new('LnxIntSocket', 'Lifetime') - self.outputs.new('LnxFloatSocket', 'Lifetime Random') - self.outputs.new('LnxIntSocket', 'Emit From') - - self.outputs.new('LnxVectorSocket', 'Velocity') - self.outputs.new('LnxFloatSocket', 'Velocity Random') - self.outputs.new('LnxVectorSocket', 'Gravity') - self.outputs.new('LnxFloatSocket', 'Weight Gravity') - - self.outputs.new('LnxFloatSocket', 'Speed') - - self.outputs.new('LnxFloatSocket', 'Time') - self.outputs.new('LnxFloatSocket', 'Lap') - self.outputs.new('LnxFloatSocket', 'Lap Time') - self.outputs.new('LnxIntSocket', 'Count') +from lnx.logicnode.lnx_nodes import * + +class GetParticleDataNode(LnxLogicTreeNode): + """Returns the data of the given Particle System.""" + bl_idname = 'LNGetParticleDataNode' + bl_label = 'Get Particle Data' + lnx_version = 1 + + def lnx_init(self, context): + self.inputs.new('LnxNodeSocketObject', 'Object') + self.inputs.new('LnxIntSocket', 'Slot') + + self.outputs.new('LnxStringSocket', 'Name') + self.outputs.new('LnxFloatSocket', 'Particle Size') + self.outputs.new('LnxIntSocket', 'Frame Start') + self.outputs.new('LnxIntSocket', 'Frame End') + self.outputs.new('LnxIntSocket', 'Lifetime') + self.outputs.new('LnxFloatSocket', 'Lifetime Random') + self.outputs.new('LnxIntSocket', 'Emit From') + self.outputs.new('LnxBoolSocket', 'Auto Start') + self.outputs.new('LnxBoolSocket', 'Is Unique') + self.outputs.new('LnxBoolSocket', 'Loop') + + self.outputs.new('LnxVectorSocket', 'Velocity') + self.outputs.new('LnxFloatSocket', 'Velocity Random') + self.outputs.new('LnxVectorSocket', 'Gravity') + self.outputs.new('LnxFloatSocket', 'Weight Gravity') + + self.outputs.new('LnxFloatSocket', 'Speed') + + self.outputs.new('LnxFloatSocket', 'Time') + self.outputs.new('LnxFloatSocket', 'Lap') + self.outputs.new('LnxFloatSocket', 'Lap Time') + self.outputs.new('LnxIntSocket', 'Count') From 03106eff024f065765cb52d090556bca57399201 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:01:58 +0000 Subject: [PATCH 57/92] t3du - Particle nodes Update --- .../particle/LN_set_particle_data.py | 125 ++++++++++-------- 1 file changed, 67 insertions(+), 58 deletions(-) diff --git a/leenkx/blender/lnx/logicnode/particle/LN_set_particle_data.py b/leenkx/blender/lnx/logicnode/particle/LN_set_particle_data.py index 805ac2b9..4112b93b 100644 --- a/leenkx/blender/lnx/logicnode/particle/LN_set_particle_data.py +++ b/leenkx/blender/lnx/logicnode/particle/LN_set_particle_data.py @@ -1,58 +1,67 @@ -from lnx.logicnode.lnx_nodes import * - -class SetParticleDataNode(LnxLogicTreeNode): - """Sets the parameters of the given particle system.""" - bl_idname = 'LNSetParticleDataNode' - bl_label = 'Set Particle Data' - lnx_version = 1 - - def remove_extra_inputs(self, context): - while len(self.inputs) > 3: - self.inputs.remove(self.inputs[-1]) - if self.property0 == 'Particle Size': - self.add_input('LnxFloatSocket', 'Particle Size') - if self.property0 == 'Frame End': - self.add_input('LnxIntSocket', 'Frame End') - if self.property0 == 'Frame Start': - self.add_input('LnxIntSocket', 'Frame Start') - if self.property0 == 'Lifetime': - self.add_input('LnxIntSocket', 'Lifetime') - if self.property0 == 'Lifetime Random': - self.add_input('LnxFloatSocket', 'Lifetime Random') - if self.property0 == 'Emit From': - self.add_input('LnxIntSocket', 'Emit From') - if self.property0 == 'Velocity': - self.add_input('LnxVectorSocket', 'Velocity') - if self.property0 == 'Velocity Random': - self.add_input('LnxFloatSocket', 'Velocity Random') - if self.property0 == 'Weight Gravity': - self.add_input('LnxFloatSocket', 'Weight Gravity') - if self.property0 == 'Speed': - self.add_input('LnxFloatSocket', 'Speed') - - - property0: HaxeEnumProperty( - 'property0', - items = [('Particle Size', 'Particle Size', 'for the system'), - ('Frame Start', 'Frame Start', 'for the system'), - ('Frame End', 'Frame End', 'for the system'), - ('Lifetime', 'Lifetime', 'for the instance'), - ('Lifetime Random', 'Lifetime Random', 'for the system'), - ('Emit From', 'Emit From', 'for the system (Vertices:0 Faces:1 Volume: 2)'), - ('Velocity', 'Velocity', 'for the instance'), - ('Velocity Random', 'Velocity Random', 'for the system'), - ('Weight Gravity', 'Weight Gravity', 'for the instance'), - ('Speed', 'Speed', 'for the instance')], - name='', default='Speed', update=remove_extra_inputs) - - - def lnx_init(self, context): - self.add_input('LnxNodeSocketAction', 'In') - self.add_input('LnxNodeSocketObject', 'Object') - self.add_input('LnxIntSocket', 'Slot') - self.add_input('LnxFloatSocket', 'Speed', default_value=1.0) - - self.add_output('LnxNodeSocketAction', 'Out') - - def draw_buttons(self, context, layout): - layout.prop(self, 'property0') +from lnx.logicnode.lnx_nodes import * + +class SetParticleDataNode(LnxLogicTreeNode): + """Sets the parameters of the given particle system.""" + bl_idname = 'LNSetParticleDataNode' + bl_label = 'Set Particle Data' + lnx_version = 1 + + def remove_extra_inputs(self, context): + while len(self.inputs) > 3: + self.inputs.remove(self.inputs[-1]) + if self.property0 == 'Particle Size': + self.add_input('LnxFloatSocket', 'Particle Size') + if self.property0 == 'Frame End': + self.add_input('LnxIntSocket', 'Frame End') + if self.property0 == 'Frame Start': + self.add_input('LnxIntSocket', 'Frame Start') + if self.property0 == 'Lifetime': + self.add_input('LnxIntSocket', 'Lifetime') + if self.property0 == 'Lifetime Random': + self.add_input('LnxFloatSocket', 'Lifetime Random') + if self.property0 == 'Emit From': + self.add_input('LnxIntSocket', 'Emit From') + if self.property0 == 'Auto Start': + self.add_input('LnxBoolSocket', 'Auto Start') + if self.property0 == 'Is Unique': + self.add_input('LnxBoolSocket', 'Is Unique') + if self.property0 == 'Loop': + self.add_input('LnxBoolSocket', 'Loop') + if self.property0 == 'Velocity': + self.add_input('LnxVectorSocket', 'Velocity') + if self.property0 == 'Velocity Random': + self.add_input('LnxFloatSocket', 'Velocity Random') + if self.property0 == 'Weight Gravity': + self.add_input('LnxFloatSocket', 'Weight Gravity') + if self.property0 == 'Speed': + self.add_input('LnxFloatSocket', 'Speed') + + + property0: HaxeEnumProperty( + 'property0', + items = [('Particle Size', 'Particle Size', 'for the system'), + ('Frame Start', 'Frame Start', 'for the system'), + ('Frame End', 'Frame End', 'for the system'), + ('Lifetime', 'Lifetime', 'for the instance'), + ('Lifetime Random', 'Lifetime Random', 'for the system'), + ('Emit From', 'Emit From', 'for the system (Vertices:0 Faces:1 Volume: 2)'), + ('Auto Start', 'Auto Start', 'for the system'), + ('Is Unique', 'Is Unique', 'for the system'), + ('Loop', 'Loop', 'for the system'), + ('Velocity', 'Velocity', 'for the instance'), + ('Velocity Random', 'Velocity Random', 'for the system'), + ('Weight Gravity', 'Weight Gravity', 'for the instance'), + ('Speed', 'Speed', 'for the instance')], + name='', default='Speed', update=remove_extra_inputs) + + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxNodeSocketObject', 'Object') + self.add_input('LnxIntSocket', 'Slot') + self.add_input('LnxFloatSocket', 'Speed', default_value=1.0) + + self.add_output('LnxNodeSocketAction', 'Out') + + def draw_buttons(self, context, layout): + layout.prop(self, 'property0') From 6e62917819d84a208151c955beafabe9324d8c9c Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:08:41 +0000 Subject: [PATCH 58/92] t3du - Post Process Updates --- .../blur_bilat_blend_pass.frag.glsl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.frag.glsl b/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.frag.glsl index 21092144..61ab134e 100644 --- a/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.frag.glsl +++ b/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.frag.glsl @@ -3,6 +3,10 @@ #include "compiled.inc" +#ifdef _CPostprocess +uniform vec4 PPComp17; +#endif + uniform sampler2D tex; uniform vec2 dir; uniform vec2 screenSize; @@ -45,6 +49,12 @@ void main() { res += factor * col; } + #ifdef _CPostprocess + vec3 AirColor = vec3(PPComp17.x, PPComp17.y, PPComp17.z); + #else + vec3 AirColor = volumAirColor; + #endif + res /= sumfactor; - fragColor = vec4(volumAirColor * res, 1.0); + fragColor = vec4(AirColor * res, 1.0); } From 2eaf83d89c78ad0cc95988c45a488e629f3c3538 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:09:31 +0000 Subject: [PATCH 59/92] t3du - Post Process Updates --- .../Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.json b/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.json index 2b127184..10d9d49d 100644 --- a/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.json +++ b/leenkx/Shaders/blur_bilat_blend_pass/blur_bilat_blend_pass.json @@ -19,6 +19,11 @@ { "name": "screenSize", "link": "_screenSize" + }, + { + "name": "PPComp17", + "link": "_PPComp17", + "ifdef": ["_CPostprocess"] } ], "texture_params": [], From 535e69dcd0b69a8b19471c1d814fbab7609bbe88 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:15:45 +0000 Subject: [PATCH 60/92] t3du - Post Process Updates --- .../compositor_pass/compositor_pass.frag.glsl | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl b/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl index ac386704..9749556b 100644 --- a/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl +++ b/leenkx/Shaders/compositor_pass/compositor_pass.frag.glsl @@ -62,8 +62,11 @@ uniform vec3 PPComp5; uniform vec3 PPComp6; uniform vec3 PPComp7; uniform vec3 PPComp8; +uniform vec3 PPComp11; uniform vec3 PPComp14; uniform vec4 PPComp15; +uniform vec4 PPComp16; +uniform vec4 PPComp18; #endif // #ifdef _CPos @@ -106,6 +109,16 @@ in vec2 texCoord; out vec4 fragColor; #ifdef _CFog + #ifdef _CPostprocess + vec3 FogColor = vec3(PPComp18.x, PPComp18.y, PPComp18.z); + float FogAmountA = PPComp18.w; + float FogAmountB = PPComp11.z; + #else + vec3 FogColor = compoFogColor; + float FogAmountA = compoFogAmountA; + float FogAmountB = compoFogAmountB; + #endif + // const vec3 compoFogColor = vec3(0.5, 0.6, 0.7); // const float compoFogAmountA = 1.0; // b = 0.01 // const float compoFogAmountB = 1.0; // c = 0.1 @@ -118,8 +131,8 @@ out vec4 fragColor; // } vec3 applyFog(vec3 rgb, float distance) { // float fogAmount = 1.0 - exp(-distance * compoFogAmountA); - float fogAmount = 1.0 - exp(-distance * (compoFogAmountA / 100)); - return mix(rgb, compoFogColor, fogAmount); + float fogAmount = 1.0 - exp(-distance * (FogAmountA / 100)); + return mix(rgb, FogColor, fogAmount); } #endif @@ -349,16 +362,22 @@ void main() { #ifdef _CSharpen #ifdef _CPostprocess - float strengthSharpen = PPComp14.y; + float strengthSharpen = PPComp14.y; + vec3 SharpenColor = vec3(PPComp16.x, PPComp16.y, PPComp16.z); + float SharpenSize = PPComp16.w; #else float strengthSharpen = compoSharpenStrength; + vec3 SharpenColor = compoSharpenColor; + float SharpenSize = compoSharpenSize; #endif - vec3 col1 = textureLod(tex, texCo + vec2(-texStep.x, -texStep.y) * 1.5, 0.0).rgb; - vec3 col2 = textureLod(tex, texCo + vec2(texStep.x, -texStep.y) * 1.5, 0.0).rgb; - vec3 col3 = textureLod(tex, texCo + vec2(-texStep.x, texStep.y) * 1.5, 0.0).rgb; - vec3 col4 = textureLod(tex, texCo + vec2(texStep.x, texStep.y) * 1.5, 0.0).rgb; + vec3 col1 = textureLod(tex, texCo + vec2(-texStep.x, -texStep.y) * SharpenSize, 0.0).rgb; + vec3 col2 = textureLod(tex, texCo + vec2(texStep.x, -texStep.y) * SharpenSize, 0.0).rgb; + vec3 col3 = textureLod(tex, texCo + vec2(-texStep.x, texStep.y) * SharpenSize, 0.0).rgb; + vec3 col4 = textureLod(tex, texCo + vec2(texStep.x, texStep.y) * SharpenSize, 0.0).rgb; vec3 colavg = (col1 + col2 + col3 + col4) * 0.25; - fragColor.rgb += (fragColor.rgb - colavg) * strengthSharpen; + + float edgeMagnitude = length(fragColor.rgb - colavg); + fragColor.rgb = mix(fragColor.rgb, SharpenColor, min(edgeMagnitude * strengthSharpen * 2.0, 1.0)); #endif #ifdef _CFog @@ -407,7 +426,11 @@ void main() { #endif #ifdef _CExposure - fragColor.rgb += fragColor.rgb * compoExposureStrength; + #ifdef _CPostprocess + fragColor.rgb+=fragColor.rgb*PPComp8.x; + #else + fragColor.rgb+= fragColor.rgb*compoExposureStrength; + #endif #endif #ifdef _CPostprocess @@ -415,8 +438,13 @@ void main() { #endif #ifdef _AutoExposure + #ifdef _CPostprocess + float AEStrength = PPComp8.y; + #else + float AEStrength = autoExposureStrength; + #endif float expo = 2.0 - clamp(length(textureLod(histogram, vec2(0.5, 0.5), 0).rgb), 0.0, 1.0); - fragColor.rgb *= pow(expo, autoExposureStrength * 2.0); + fragColor.rgb *= pow(expo, AEStrength * 2.0); #endif // Clamp color to get rid of INF values that don't work for the tone mapping below From bc0bf41b9151f3e7507b03431e0e5f3e28a32cf5 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:17:17 +0000 Subject: [PATCH 61/92] t3du - Post Process Updates --- leenkx/Shaders/compositor_pass/compositor_pass.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/leenkx/Shaders/compositor_pass/compositor_pass.json b/leenkx/Shaders/compositor_pass/compositor_pass.json index e743fbb9..a1a74bcf 100644 --- a/leenkx/Shaders/compositor_pass/compositor_pass.json +++ b/leenkx/Shaders/compositor_pass/compositor_pass.json @@ -235,6 +235,16 @@ "name": "PPComp15", "link": "_PPComp15", "ifdef": ["_CPostprocess"] + }, + { + "name": "PPComp16", + "link": "_PPComp16", + "ifdef": ["_CPostprocess"] + }, + { + "name": "PPComp18", + "link": "_PPComp18", + "ifdef": ["_CPostprocess"] } ], "texture_params": [], From dfa99fcb1462bf5f945d46d60e0169b47a800609 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:18:36 +0000 Subject: [PATCH 62/92] t3du - Post Process Updates --- .../Shaders/histogram_pass/histogram_pass.frag.glsl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/leenkx/Shaders/histogram_pass/histogram_pass.frag.glsl b/leenkx/Shaders/histogram_pass/histogram_pass.frag.glsl index f36a9294..756f218e 100644 --- a/leenkx/Shaders/histogram_pass/histogram_pass.frag.glsl +++ b/leenkx/Shaders/histogram_pass/histogram_pass.frag.glsl @@ -2,13 +2,22 @@ #include "compiled.inc" +#ifdef _CPostprocess +uniform vec3 PPComp8; +#endif + uniform sampler2D tex; in vec2 texCoord; out vec4 fragColor; void main() { - fragColor.a = 0.01 * autoExposureSpeed; + #ifdef _CPostprocess + fragColor.a = 0.01 * PPComp8.z; + #else + fragColor.a = 0.01 * autoExposureSpeed; + #endif + fragColor.rgb = textureLod(tex, vec2(0.5, 0.5), 0.0).rgb + textureLod(tex, vec2(0.2, 0.2), 0.0).rgb + textureLod(tex, vec2(0.8, 0.2), 0.0).rgb + From b7b7edb5e2367f63c11ec42557e627e3ed7935e5 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:19:16 +0000 Subject: [PATCH 63/92] t3du - Post Process Updates --- leenkx/Shaders/histogram_pass/histogram_pass.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/leenkx/Shaders/histogram_pass/histogram_pass.json b/leenkx/Shaders/histogram_pass/histogram_pass.json index 0c17e50a..fa865911 100644 --- a/leenkx/Shaders/histogram_pass/histogram_pass.json +++ b/leenkx/Shaders/histogram_pass/histogram_pass.json @@ -8,7 +8,13 @@ "blend_source": "source_alpha", "blend_destination": "inverse_source_alpha", "blend_operation": "add", - "links": [], + "links": [ + { + "name": "PPComp8", + "link": "_PPComp8", + "ifdef": ["_CPostprocess"] + } + ], "texture_params": [], "vertex_shader": "../include/pass.vert.glsl", "fragment_shader": "histogram_pass.frag.glsl" From 91ae0533467455dc0211d28640607e81bbb04b88 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:21:47 +0000 Subject: [PATCH 64/92] t3du - Post Process Updates --- .../volumetric_light/volumetric_light.frag.glsl | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/leenkx/Shaders/volumetric_light/volumetric_light.frag.glsl b/leenkx/Shaders/volumetric_light/volumetric_light.frag.glsl index 19beb25f..bb342fc6 100644 --- a/leenkx/Shaders/volumetric_light/volumetric_light.frag.glsl +++ b/leenkx/Shaders/volumetric_light/volumetric_light.frag.glsl @@ -11,6 +11,11 @@ #include "std/light_common.glsl" #endif +#ifdef _CPostprocess +uniform vec3 PPComp11; +uniform vec4 PPComp17; +#endif + uniform sampler2D gbufferD; uniform sampler2D snoise; @@ -87,7 +92,13 @@ out float fragColor; const float tScat = 0.08; const float tAbs = 0.0; const float tExt = tScat + tAbs; -const float stepLen = 1.0 / volumSteps; +#ifdef _CPostprocess + float stepLen = 1.0 / int(PPComp11.y); + float AirTurbidity = PPComp17.w; +#else + const float stepLen = 1.0 / volumSteps; + float AirTurbidity = volumAirTurbidity; +#endif const float lighting = 0.4; void rayStep(inout vec3 curPos, inout float curOpticalDepth, inout float scatteredLightAmount, float stepLenWorld, vec3 viewVecNorm) { @@ -162,5 +173,5 @@ void main() { rayStep(curPos, curOpticalDepth, scatteredLightAmount, stepLenWorld, viewVecNorm); } - fragColor = scatteredLightAmount * volumAirTurbidity; + fragColor = scatteredLightAmount * AirTurbidity; } From 9749467cd75b7a6a8d01fb1564c687dcc971b9f1 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:25:19 +0000 Subject: [PATCH 65/92] t3du - Post Process Updates --- leenkx/Shaders/volumetric_light/volumetric_light.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/leenkx/Shaders/volumetric_light/volumetric_light.json b/leenkx/Shaders/volumetric_light/volumetric_light.json index 09a202f5..2f5f7b01 100644 --- a/leenkx/Shaders/volumetric_light/volumetric_light.json +++ b/leenkx/Shaders/volumetric_light/volumetric_light.json @@ -140,6 +140,16 @@ "link": "_biasLightWorldViewProjectionMatrixSpot3", "ifndef": ["_ShadowMapAtlas"], "ifdef": ["_Spot", "_ShadowMap"] + }, + { + "name": "PPComp11", + "link": "_PPComp11", + "ifdef": ["_CPostprocess"] + }, + { + "name": "PPComp17", + "link": "_PPComp17", + "ifdef": ["_CPostprocess"] } ], "texture_params": [], From 741a12de78d3a7782ded0bfe41ae62813b626ca4 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:27:31 +0000 Subject: [PATCH 66/92] Add leenkx/Sources/leenkx/logicnode/AutoExposureGetNode.hx --- .../leenkx/logicnode/AutoExposureGetNode.hx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/AutoExposureGetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/AutoExposureGetNode.hx b/leenkx/Sources/leenkx/logicnode/AutoExposureGetNode.hx new file mode 100644 index 00000000..95a8edfe --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/AutoExposureGetNode.hx @@ -0,0 +1,16 @@ +package leenkx.logicnode; + +class AutoExposureGetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function get(from:Int):Dynamic { + return switch (from) { + case 0: leenkx.renderpath.Postprocess.auto_exposure_uniforms[0]; + case 1: leenkx.renderpath.Postprocess.auto_exposure_uniforms[1]; + default: 0.0; + } + } +} \ No newline at end of file From eaa34308d0057c0454fa46b31e566f37010170b9 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:28:33 +0000 Subject: [PATCH 67/92] Add leenkx/Sources/leenkx/logicnode/AutoExposureSetNode.hx --- .../leenkx/logicnode/AutoExposureSetNode.hx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/AutoExposureSetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/AutoExposureSetNode.hx b/leenkx/Sources/leenkx/logicnode/AutoExposureSetNode.hx new file mode 100644 index 00000000..3b94a040 --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/AutoExposureSetNode.hx @@ -0,0 +1,15 @@ +package leenkx.logicnode; + +class AutoExposureSetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function run(from:Int) { + leenkx.renderpath.Postprocess.auto_exposure_uniforms[0] = inputs[1].get(); + leenkx.renderpath.Postprocess.auto_exposure_uniforms[1] = inputs[2].get(); + + runOutput(0); + } +} \ No newline at end of file From 48ad4322cff74744c9fd5e3e4a663a8da6c24fbe Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:33:21 +0000 Subject: [PATCH 68/92] t3du - Post Process Updates --- .../Sources/leenkx/logicnode/CameraSetNode.hx | 53 +++++++++++++------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/leenkx/Sources/leenkx/logicnode/CameraSetNode.hx b/leenkx/Sources/leenkx/logicnode/CameraSetNode.hx index 74ee47f0..21c4ade9 100644 --- a/leenkx/Sources/leenkx/logicnode/CameraSetNode.hx +++ b/leenkx/Sources/leenkx/logicnode/CameraSetNode.hx @@ -1,26 +1,49 @@ package leenkx.logicnode; class CameraSetNode extends LogicNode { - + + public var property0: String; + public function new(tree:LogicTree) { super(tree); } override function run(from:Int) { - leenkx.renderpath.Postprocess.camera_uniforms[0] = inputs[1].get();//Camera: F-Number - leenkx.renderpath.Postprocess.camera_uniforms[1] = inputs[2].get();//Camera: Shutter time - leenkx.renderpath.Postprocess.camera_uniforms[2] = inputs[3].get();//Camera: ISO - leenkx.renderpath.Postprocess.camera_uniforms[3] = inputs[4].get();//Camera: Exposure Compensation - leenkx.renderpath.Postprocess.camera_uniforms[4] = inputs[5].get();//Fisheye Distortion - leenkx.renderpath.Postprocess.camera_uniforms[5] = inputs[6].get();//DoF AutoFocus §§ If true, it ignores the DoF Distance setting - leenkx.renderpath.Postprocess.camera_uniforms[6] = inputs[7].get();//DoF Distance - leenkx.renderpath.Postprocess.camera_uniforms[7] = inputs[8].get();//DoF Focal Length mm - leenkx.renderpath.Postprocess.camera_uniforms[8] = inputs[9].get();//DoF F-Stop - leenkx.renderpath.Postprocess.camera_uniforms[9] = inputs[10].get();//Tonemapping Method - leenkx.renderpath.Postprocess.camera_uniforms[10] = inputs[11].get();//Distort - leenkx.renderpath.Postprocess.camera_uniforms[11] = inputs[12].get();//Film Grain - leenkx.renderpath.Postprocess.camera_uniforms[12] = inputs[13].get();//Sharpen - leenkx.renderpath.Postprocess.camera_uniforms[13] = inputs[14].get();//Vignette + + switch (property0) { + case 'F-stop': + leenkx.renderpath.Postprocess.camera_uniforms[0] = inputs[1].get();//Camera: F-Number + case 'Shutter Time': + leenkx.renderpath.Postprocess.camera_uniforms[1] = inputs[1].get();//Camera: Shutter time + case 'ISO': + leenkx.renderpath.Postprocess.camera_uniforms[2] = inputs[1].get();//Camera: ISO + case 'Exposure Compensation': + leenkx.renderpath.Postprocess.camera_uniforms[3] = inputs[1].get();//Camera: Exposure Compensation + case 'Fisheye Distortion': + leenkx.renderpath.Postprocess.camera_uniforms[4] = inputs[1].get();//Fisheye Distortion + case 'Auto Focus': + leenkx.renderpath.Postprocess.camera_uniforms[5] = inputs[1].get();//DoF AutoFocus §§ If true, it ignores the DoF Distance setting + case 'DoF Distance': + leenkx.renderpath.Postprocess.camera_uniforms[6] = inputs[1].get();//DoF Distance + case 'DoF Length': + leenkx.renderpath.Postprocess.camera_uniforms[7] = inputs[1].get();//DoF Focal Length mm + case 'DoF F-Stop': + leenkx.renderpath.Postprocess.camera_uniforms[8] = inputs[1].get();//DoF F-Stop + case 'Tonemapping': + leenkx.renderpath.Postprocess.camera_uniforms[9] = inputs[1].get();//Tonemapping Method + case 'Distort': + leenkx.renderpath.Postprocess.camera_uniforms[10] = inputs[1].get();//Distort + case 'Film Grain': + leenkx.renderpath.Postprocess.camera_uniforms[11] = inputs[1].get();//Film Grain + case 'Sharpen': + leenkx.renderpath.Postprocess.camera_uniforms[12] = inputs[1].get();//Sharpen + case 'Vignette': + leenkx.renderpath.Postprocess.camera_uniforms[13] = inputs[1].get();//Vignette + case 'Exposure': + leenkx.renderpath.Postprocess.exposure_uniforms[0] = inputs[1].get();//Exposure + default: + null; + } runOutput(0); } From 047983a2800f24f169c2caeca4b2f78a01f830b2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:34:24 +0000 Subject: [PATCH 69/92] Add leenkx/Sources/leenkx/logicnode/SharpenGetNode.hx --- .../Sources/leenkx/logicnode/SharpenGetNode.hx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/SharpenGetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/SharpenGetNode.hx b/leenkx/Sources/leenkx/logicnode/SharpenGetNode.hx new file mode 100644 index 00000000..3115232e --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/SharpenGetNode.hx @@ -0,0 +1,17 @@ +package leenkx.logicnode; + +class SharpenGetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function get(from:Int):Dynamic { + return switch (from) { + case 0: leenkx.renderpath.Postprocess.sharpen_uniforms[0]; + case 1: leenkx.renderpath.Postprocess.sharpen_uniforms[1][0]; + case 2: leenkx.renderpath.Postprocess.camera_uniforms[12]; + default: 0.0; + } + } +} \ No newline at end of file From 141567467f45d4c3c8fe55f39bcb09ccdcc6ba2e Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:35:24 +0000 Subject: [PATCH 70/92] Add leenkx/Sources/leenkx/logicnode/SharpenSetNode.hx --- .../Sources/leenkx/logicnode/SharpenSetNode.hx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/SharpenSetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/SharpenSetNode.hx b/leenkx/Sources/leenkx/logicnode/SharpenSetNode.hx new file mode 100644 index 00000000..eb08228d --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/SharpenSetNode.hx @@ -0,0 +1,18 @@ +package leenkx.logicnode; + +class SharpenSetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function run(from:Int) { + leenkx.renderpath.Postprocess.sharpen_uniforms[0][0] = inputs[1].get().x; + leenkx.renderpath.Postprocess.sharpen_uniforms[0][1] = inputs[1].get().y; + leenkx.renderpath.Postprocess.sharpen_uniforms[0][2] = inputs[1].get().z; + leenkx.renderpath.Postprocess.sharpen_uniforms[1][0] = inputs[2].get(); + leenkx.renderpath.Postprocess.camera_uniforms[12] = inputs[3].get(); + + runOutput(0); + } +} \ No newline at end of file From 7c13a25cafb06d8c6a53fc0fc87068aab17a1f81 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:36:11 +0000 Subject: [PATCH 71/92] Add leenkx/Sources/leenkx/logicnode/VolumetricFogGetNode.hx --- .../leenkx/logicnode/VolumetricFogGetNode.hx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/VolumetricFogGetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/VolumetricFogGetNode.hx b/leenkx/Sources/leenkx/logicnode/VolumetricFogGetNode.hx new file mode 100644 index 00000000..0ac5813e --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/VolumetricFogGetNode.hx @@ -0,0 +1,17 @@ +package leenkx.logicnode; + +class VolumetricFogGetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function get(from:Int):Dynamic { + return switch (from) { + case 0: leenkx.renderpath.Postprocess.volumetric_fog_uniforms[0]; + case 1: leenkx.renderpath.Postprocess.volumetric_fog_uniforms[1][0]; + case 2: leenkx.renderpath.Postprocess.volumetric_fog_uniforms[2][0]; + default: 0.0; + } + } +} \ No newline at end of file From a318758cbfa4c764f9be3453b395a7e0a3120af7 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:36:55 +0000 Subject: [PATCH 72/92] Add leenkx/Sources/leenkx/logicnode/VolumetricFogSetNode.hx --- .../leenkx/logicnode/VolumetricFogSetNode.hx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/VolumetricFogSetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/VolumetricFogSetNode.hx b/leenkx/Sources/leenkx/logicnode/VolumetricFogSetNode.hx new file mode 100644 index 00000000..5c96d20b --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/VolumetricFogSetNode.hx @@ -0,0 +1,18 @@ +package leenkx.logicnode; + +class VolumetricFogSetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function run(from:Int) { + leenkx.renderpath.Postprocess.volumetric_fog_uniforms[0][0] = inputs[1].get().x; + leenkx.renderpath.Postprocess.volumetric_fog_uniforms[0][1] = inputs[1].get().y; + leenkx.renderpath.Postprocess.volumetric_fog_uniforms[0][2] = inputs[1].get().z; + leenkx.renderpath.Postprocess.volumetric_fog_uniforms[1][0] = inputs[2].get(); + leenkx.renderpath.Postprocess.volumetric_fog_uniforms[2][0] = inputs[3].get(); + + runOutput(0); + } +} \ No newline at end of file From a40a035c03cb19b513d860b334aa5fd4e24dae49 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:56:31 +0000 Subject: [PATCH 73/92] Add leenkx/Sources/leenkx/logicnode/VolumetricLightGetNode.hx --- .../leenkx/logicnode/VolumetricLightGetNode.hx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/VolumetricLightGetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/VolumetricLightGetNode.hx b/leenkx/Sources/leenkx/logicnode/VolumetricLightGetNode.hx new file mode 100644 index 00000000..e991420f --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/VolumetricLightGetNode.hx @@ -0,0 +1,17 @@ +package leenkx.logicnode; + +class VolumetricLightGetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function get(from:Int):Dynamic { + return switch (from) { + case 0: leenkx.renderpath.Postprocess.volumetric_light_uniforms[0]; + case 1: leenkx.renderpath.Postprocess.volumetric_light_uniforms[1][0]; + case 2: leenkx.renderpath.Postprocess.volumetric_light_uniforms[2][0]; + default: 0.0; + } + } +} \ No newline at end of file From d8b37efe1bb6398ce0b390afa9f8b60566502913 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 18:57:18 +0000 Subject: [PATCH 74/92] Add leenkx/Sources/leenkx/logicnode/VolumetricLightSetNode.hx --- .../leenkx/logicnode/VolumetricLightSetNode.hx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/VolumetricLightSetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/VolumetricLightSetNode.hx b/leenkx/Sources/leenkx/logicnode/VolumetricLightSetNode.hx new file mode 100644 index 00000000..3017040b --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/VolumetricLightSetNode.hx @@ -0,0 +1,18 @@ +package leenkx.logicnode; + +class VolumetricLightSetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function run(from:Int) { + leenkx.renderpath.Postprocess.volumetric_light_uniforms[0][0] = inputs[1].get().x; + leenkx.renderpath.Postprocess.volumetric_light_uniforms[0][1] = inputs[1].get().y; + leenkx.renderpath.Postprocess.volumetric_light_uniforms[0][2] = inputs[1].get().z; + leenkx.renderpath.Postprocess.volumetric_light_uniforms[1][0] = inputs[2].get(); + leenkx.renderpath.Postprocess.volumetric_light_uniforms[2][0] = inputs[3].get(); + + runOutput(0); + } +} \ No newline at end of file From dd6cd16661721d436c194e699e6119ddb8717061 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:01:21 +0000 Subject: [PATCH 75/92] t3du - Post Process Updates --- .../Sources/leenkx/renderpath/Postprocess.hx | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/leenkx/Sources/leenkx/renderpath/Postprocess.hx b/leenkx/Sources/leenkx/renderpath/Postprocess.hx index 49f52fc1..8e2d6402 100644 --- a/leenkx/Sources/leenkx/renderpath/Postprocess.hx +++ b/leenkx/Sources/leenkx/renderpath/Postprocess.hx @@ -54,10 +54,15 @@ class Postprocess { 0, //9: Tonemapping Method 2.0, //10: Distort 2.0, //11: Film Grain - 0.25, //12: Sharpen + 0.25, //12: Sharpen Strength 0.7 //13: Vignette ]; + public static var sharpen_uniforms = [ + [0.0, 0.0, 0.0], //0: Sharpen Color + [2.5] //1: Sharpen Size + ]; + public static var tonemapper_uniforms = [ 1.0, //0: Slope 1.0, //1: Toe @@ -107,6 +112,27 @@ class Postprocess { 1 //3: On/Off ]; + public static var exposure_uniforms = [ + 1 //0: Exposure + ]; + + public static var auto_exposure_uniforms = [ + 1, //0: Auto Exposure Strength + 1 //1: Auto Exposure Speed + ]; + + public static var volumetric_light_uniforms = [ + [1.0, 1.0, 1.0], //0: Volumetric Light Air Color + [1.0], //1: Volumetric Light Air Turbidity + [20.0] //2: Volumetric Light Steps + ]; + + public static var volumetric_fog_uniforms = [ + [0.5, 0.6, 0.7], //0: Volumetric Fog Color + [0.25], //1: Volumetric Fog Amount A + [50.0] //2: Volumetric Fog Amount B + ]; + public static function vec3Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 { var v:Vec4 = null; @@ -286,6 +312,11 @@ class Postprocess { v.x = lenstexture_uniforms[2]; //Lum min v.y = lenstexture_uniforms[3]; //Lum max v.z = lenstexture_uniforms[4]; //Expo + case "_PPComp8": + v = iron.object.Uniforms.helpVec; + v.x = exposure_uniforms[0]; //Exposure + v.y = auto_exposure_uniforms[0]; //Auto Exposure Strength + v.z = auto_exposure_uniforms[1]; //Auto Exposure Speed case "_PPComp9": v = iron.object.Uniforms.helpVec; v.x = ssr_uniforms[0]; //Step @@ -299,8 +330,8 @@ class Postprocess { case "_PPComp11": v = iron.object.Uniforms.helpVec; v.x = bloom_uniforms[2]; // Bloom Strength - v.y = 0; // Unused - v.z = 0; // Unused + v.y = volumetric_light_uniforms[2][0]; //Volumetric Light Steps + v.z = volumetric_fog_uniforms[2][0]; //Volumetric Fog Amount B case "_PPComp12": v = iron.object.Uniforms.helpVec; v.x = ssao_uniforms[0]; //SSAO Strength @@ -341,6 +372,24 @@ class Postprocess { v.y = letterbox_uniforms[0][1]; v.z = letterbox_uniforms[0][2]; v.w = letterbox_uniforms[1][0]; //Size + case "_PPComp16": + v = iron.object.Uniforms.helpVec; + v.x = sharpen_uniforms[0][0]; //Color + v.y = sharpen_uniforms[0][1]; + v.z = sharpen_uniforms[0][2]; + v.w = sharpen_uniforms[1][0]; //Size + case "_PPComp17": + v = iron.object.Uniforms.helpVec; + v.x = volumetric_light_uniforms[0][0]; //Air Color + v.y = volumetric_light_uniforms[0][1]; + v.z = volumetric_light_uniforms[0][2]; + v.w = volumetric_light_uniforms[1][0]; //Air Turbidity + case "_PPComp18": + v = iron.object.Uniforms.helpVec; + v.x = volumetric_fog_uniforms[0][0]; //Color + v.y = volumetric_fog_uniforms[0][1]; + v.z = volumetric_fog_uniforms[0][2]; + v.w = volumetric_fog_uniforms[1][0]; //Amount A } return v; From 012abfeaf6eb7c984d5f13d56f7b0317a6527454 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:11:02 +0000 Subject: [PATCH 76/92] t3du - Post Process Updates --- leenkx/blender/lnx/write_data.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leenkx/blender/lnx/write_data.py b/leenkx/blender/lnx/write_data.py index 5a4f94f3..79f03587 100644 --- a/leenkx/blender/lnx/write_data.py +++ b/leenkx/blender/lnx/write_data.py @@ -785,6 +785,8 @@ const vec3 compoLetterboxColor = vec3(""" + str(round(rpdat.lnx_letterbox_color[ if lnx.utils.get_active_scene().view_settings.exposure != 0.0: f.write( """const float compoExposureStrength = """ + str(round(lnx.utils.get_active_scene().view_settings.exposure * 100) / 100) + """; +const float compoSharpenSize = """ + str(round(rpdat.lnx_sharpen_size * 100) / 100) + """; +const vec3 compoSharpenColor = vec3(""" + str(round(rpdat.lnx_sharpen_color[0] * 100) / 100) + """, """ + str(round(rpdat.lnx_sharpen_color[1] * 100) / 100) + """, """ + str(round(rpdat.lnx_sharpen_color[2] * 100) / 100) + """); """) if rpdat.lnx_fog: From 15a10ea3aa7c647a4a58a3d653fc90882de6768d Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:12:33 +0000 Subject: [PATCH 77/92] t3du - Post Process Updates --- leenkx/blender/lnx/props_ui.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index a13e45e7..d1ce9bfc 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -1992,10 +1992,18 @@ class LNX_PT_RenderPathCompositorPanel(bpy.types.Panel): col.prop(rpdat, 'lnx_letterbox_size') layout.separator() + col = layout.column() + col.prop(rpdat, 'lnx_sharpen') + col = col.column(align=True) + col.enabled = rpdat.arm_sharpen + col.prop(rpdat, 'lnx_sharpen_color') + col.prop(rpdat, 'lnx_sharpen_size') + col.prop(rpdat, 'lnx_sharpen_strength') + layout.separator() + col = layout.column() draw_conditional_prop(col, 'Distort', rpdat, 'lnx_distort', 'lnx_distort_strength') draw_conditional_prop(col, 'Film Grain', rpdat, 'lnx_grain', 'lnx_grain_strength') - draw_conditional_prop(col, 'Sharpen', rpdat, 'lnx_sharpen', 'lnx_sharpen_strength') draw_conditional_prop(col, 'Vignette', rpdat, 'lnx_vignette', 'lnx_vignette_strength') layout.separator() From 3f0984e2277e8a143204042c72b0c0bfd46ef495 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:13:12 +0000 Subject: [PATCH 78/92] Update leenkx/blender/lnx/props_ui.py --- leenkx/blender/lnx/props_ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/props_ui.py b/leenkx/blender/lnx/props_ui.py index d1ce9bfc..33b0a8c8 100644 --- a/leenkx/blender/lnx/props_ui.py +++ b/leenkx/blender/lnx/props_ui.py @@ -1995,7 +1995,7 @@ class LNX_PT_RenderPathCompositorPanel(bpy.types.Panel): col = layout.column() col.prop(rpdat, 'lnx_sharpen') col = col.column(align=True) - col.enabled = rpdat.arm_sharpen + col.enabled = rpdat.lnx_sharpen col.prop(rpdat, 'lnx_sharpen_color') col.prop(rpdat, 'lnx_sharpen_size') col.prop(rpdat, 'lnx_sharpen_strength') From be06b222cb75d82abb3db09cf115c09f4348b953 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:14:54 +0000 Subject: [PATCH 79/92] t3du - Post Process Updates --- leenkx/blender/lnx/props_renderpath.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leenkx/blender/lnx/props_renderpath.py b/leenkx/blender/lnx/props_renderpath.py index 27889fc7..907a9630 100644 --- a/leenkx/blender/lnx/props_renderpath.py +++ b/leenkx/blender/lnx/props_renderpath.py @@ -603,6 +603,8 @@ class LnxRPListItem(bpy.types.PropertyGroup): lnx_grain: BoolProperty(name="Film Grain", default=False, update=assets.invalidate_shader_cache) lnx_grain_strength: FloatProperty(name="Strength", default=2.0, update=assets.invalidate_shader_cache) lnx_sharpen: BoolProperty(name="Sharpen", default=False, update=assets.invalidate_shader_cache) + lnx_sharpen_color: FloatVectorProperty(name="Color", size=3, default=[0, 0, 0], subtype='COLOR', min=0, max=1, update=assets.invalidate_shader_cache) + lnx_sharpen_size: FloatProperty(name="Size", default=2.5, update=assets.invalidate_shader_cache) lnx_sharpen_strength: FloatProperty(name="Strength", default=0.25, update=assets.invalidate_shader_cache) lnx_fog: BoolProperty(name="Volumetric Fog", default=False, update=assets.invalidate_shader_cache) lnx_fog_color: FloatVectorProperty(name="Color", size=3, subtype='COLOR', default=[0.5, 0.6, 0.7], min=0, max=1, update=assets.invalidate_shader_cache) From 0d80f3fb6d56054164b1036c27404f1bb61e560c Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:21:53 +0000 Subject: [PATCH 80/92] Add leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py --- .../postprocess/LN_get_auto_exposure_settings.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py new file mode 100644 index 00000000..208a7f6f --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py @@ -0,0 +1,11 @@ +from lnx.logicnode.arm_nodes import * + +class AutoExposureGetNode(LnxLogicTreeNode): + """Returns the auto exposure post-processing settings.""" + bl_idname = 'LNAutoExposureGetNode' + bl_label = 'Get Auto Exposure Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_output('LnxFloatSocket', 'Strength') + self.add_output('LnxFloatSocket', 'Speed') \ No newline at end of file From 18ec9712fd5c11fe0d0e97ca5ac52ca762aa0a87 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:25:19 +0000 Subject: [PATCH 81/92] Add leenkx/blender/lnx/logicnode/postprocess/LN_get_sharpen_settings.py --- .../logicnode/postprocess/LN_get_sharpen_settings.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_get_sharpen_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_sharpen_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_sharpen_settings.py new file mode 100644 index 00000000..2398ca53 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_sharpen_settings.py @@ -0,0 +1,12 @@ +from lnx.logicnode.lnx_nodes import * + +class SharpenGetNode(LnxLogicTreeNode): + """Returns the sharpen post-processing settings.""" + bl_idname = 'LNSharpenGetNode' + bl_label = 'Get Sharpen Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_output('LnxColorSocket', 'Color') + self.add_output('LnxFloatSocket', 'Size') + self.add_output('LnxFloatSocket', 'Strength') \ No newline at end of file From fe730a65ee33f21d7d3830ee6ec5721dbd4a0e00 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:35:27 +0000 Subject: [PATCH 82/92] Add leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_fog_settings.py --- .../postprocess/LN_get_volumetric_fog_settings.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_fog_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_fog_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_fog_settings.py new file mode 100644 index 00000000..95150f2c --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_fog_settings.py @@ -0,0 +1,12 @@ +from lnx.logicnode.lnx_nodes import * + +class VolumetricFogGetNode(LnxLogicTreeNode): + """Returns the volumetric fog post-processing settings.""" + bl_idname = 'LNVolumetricFogGetNode' + bl_label = 'Get Volumetric Fog Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_output('LnxColorSocket', 'Color') + self.add_output('LnxFloatSocket', 'Amount A') + self.add_output('LnxFloatSocket', 'Amount B') \ No newline at end of file From 2cc0d3db3b899fc353d633796630e9dd6f85ffd3 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:38:01 +0000 Subject: [PATCH 83/92] Add leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py --- .../logicnode/LN_get_volumetric_light_settings.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py diff --git a/leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py b/leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py new file mode 100644 index 00000000..c4ac0fda --- /dev/null +++ b/leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py @@ -0,0 +1,12 @@ +from lnx.logicnode.lnx_nodes import * + +class VolumetricLightGetNode(LnxLogicTreeNode): + """Returns the volumetric light post-processing settings.""" + bl_idname = 'LNVolumetricLightGetNode' + bl_label = 'Get Volumetric Light Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_output('LnxColorSocket', 'Air Color') + self.add_output('LnxFloatSocket', 'Air Turbidity') + self.add_output('LnxIntSocket', 'Steps') \ No newline at end of file From fd02f6bca3751c6aa13905f1c31159c04bfbd104 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:39:13 +0000 Subject: [PATCH 84/92] Add leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py --- .../lnx/logicnode/LN_set_auto_exposure_settings.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py diff --git a/leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py b/leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py new file mode 100644 index 00000000..66c611a0 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py @@ -0,0 +1,14 @@ +from lnx.logicnode.lnx_nodes import * + +class AutoExposureSetNode(LnxLogicTreeNode): + """Set the sharpen post-processing settings.""" + bl_idname = 'LNAutoExposureSetNode' + bl_label = 'Set Auto Exposure Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxFloatSocket', 'Strength', default_value=1) + self.add_input('LnxFloatSocket', 'Speed', default_value=1) + + self.add_output('LnxNodeSocketAction', 'Out') \ No newline at end of file From 9ac3de67aa252c04865e49d12d969737b7494deb Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:40:05 +0000 Subject: [PATCH 85/92] Update leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_light_settings.py --- .../{ => postprocess}/LN_get_volumetric_light_settings.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename leenkx/blender/lnx/logicnode/{ => postprocess}/LN_get_volumetric_light_settings.py (100%) diff --git a/leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_light_settings.py similarity index 100% rename from leenkx/blender/lnx/logicnode/LN_get_volumetric_light_settings.py rename to leenkx/blender/lnx/logicnode/postprocess/LN_get_volumetric_light_settings.py From 9daf6c15ab475bca63d2611ba69c519d43f96c48 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:40:33 +0000 Subject: [PATCH 86/92] Update leenkx/blender/lnx/logicnode/postprocess/LN_set_auto_exposure_settings.py --- .../logicnode/{ => postprocess}/LN_set_auto_exposure_settings.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename leenkx/blender/lnx/logicnode/{ => postprocess}/LN_set_auto_exposure_settings.py (100%) diff --git a/leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_auto_exposure_settings.py similarity index 100% rename from leenkx/blender/lnx/logicnode/LN_set_auto_exposure_settings.py rename to leenkx/blender/lnx/logicnode/postprocess/LN_set_auto_exposure_settings.py From 9914d530452f1de19b36b3639213adc00754e6d9 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:42:36 +0000 Subject: [PATCH 87/92] Add leenkx/blender/lnx/logicnode/postprocess/LN_set_sharpen_settings.py --- .../postprocess/LN_set_sharpen_settings.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_set_sharpen_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_sharpen_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_sharpen_settings.py new file mode 100644 index 00000000..f4836039 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_sharpen_settings.py @@ -0,0 +1,15 @@ +from lnx.logicnode.lnx_nodes import * + +class SharpenSetNode(LnxLogicTreeNode): + """Set the sharpen post-processing settings.""" + bl_idname = 'LNSharpenSetNode' + bl_label = 'Set Sharpen Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxColorSocket', 'Color', default_value=[0.0, 0.0, 0.0, 1.0]) + self.add_input('LnxFloatSocket', 'Size', default_value=2.5) + self.add_input('LnxFloatSocket', 'Strength', default_value=0.25) + + self.add_output('LnxNodeSocketAction', 'Out') \ No newline at end of file From ad0d750dd076b9c57db02afee9eb260b0a4a5e4e Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:43:52 +0000 Subject: [PATCH 88/92] Add leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_fog_settings.py --- .../postprocess/LN_set_volumetric_fog_settings.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_fog_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_fog_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_fog_settings.py new file mode 100644 index 00000000..6266fa6c --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_fog_settings.py @@ -0,0 +1,15 @@ +from lnx.logicnode.lnx_nodes import * + +class VolumetricFogSetNode(LnxLogicTreeNode): + """Set the volumetric fog post-processing settings.""" + bl_idname = 'LNVolumetricFogSetNode' + bl_label = 'Set Volumetric Fog Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxColorSocket', 'Color', default_value=[0.5, 0.6, 0.7, 1.0]) + self.add_input('LnxFloatSocket', 'Amount A', default_value=0.25) + self.add_input('LnxFloatSocket', 'Amount B', default_value=0.50) + + self.add_output('LnxNodeSocketAction', 'Out') \ No newline at end of file From 85912d84fb9929108770fe31bc43d3497c1ade71 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:45:39 +0000 Subject: [PATCH 89/92] Add leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_light_settings.py --- .../LN_set_volumetric_light_settings.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_light_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_light_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_light_settings.py new file mode 100644 index 00000000..860eaae5 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_volumetric_light_settings.py @@ -0,0 +1,15 @@ +from lnx.logicnode.lnx_nodes import * + +class VolumetricLightSetNode(LnxLogicTreeNode): + """Set the volumetric light post-processing settings.""" + bl_idname = 'LNVolumetricLightSetNode' + bl_label = 'Set Volumetric Light Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxColorSocket', 'Air Color', default_value=[1.0, 1.0, 1.0, 1.0]) + self.add_input('LnxFloatSocket', 'Air Turbidity', default_value=1) + self.add_input('LnxIntSocket', 'Steps', default_value=20) + + self.add_output('LnxNodeSocketAction', 'Out') \ No newline at end of file From 2c7343aa3112e7c8216cdefb6188505e017d7ac8 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:47:15 +0000 Subject: [PATCH 90/92] t3du - Post Process Updates --- .../lnx/logicnode/postprocess/LN_get_camera_post_process.py | 1 + 1 file changed, 1 insertion(+) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_camera_post_process.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_camera_post_process.py index 2a9c42c0..43be82c2 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_get_camera_post_process.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_camera_post_process.py @@ -21,6 +21,7 @@ class CameraGetNode(LnxLogicTreeNode): self.add_output('LnxFloatSocket', 'Film Grain')#11 self.add_output('LnxFloatSocket', 'Sharpen')#12 self.add_output('LnxFloatSocket', 'Vignette')#13 + self.add_output('LnxFloatSocket', 'Exposure')#14 def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.lnx_version not in (0, 3): From f779462f362a4dac44c76687f531dd9b33efa3b2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Mon, 2 Jun 2025 19:51:11 +0000 Subject: [PATCH 91/92] t3du - Post Process Updates --- .../postprocess/LN_set_camera_post_process.py | 77 +++++++++++++++---- 1 file changed, 62 insertions(+), 15 deletions(-) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_camera_post_process.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_camera_post_process.py index 3b25cf9d..c79922c7 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_set_camera_post_process.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_camera_post_process.py @@ -4,27 +4,74 @@ class CameraSetNode(LnxLogicTreeNode): """Set the post-processing effects of a camera.""" bl_idname = 'LNCameraSetNode' bl_label = 'Set Camera Post Process' - lnx_version = 4 + lnx_version = 5 + + + def remove_extra_inputs(self, context): + while len(self.inputs) > 1: + self.inputs.remove(self.inputs[-1]) + if self.property0 == 'F-stop': + self.add_input('LnxFloatSocket', 'F-stop', default_value=1.0)#0 + if self.property0 == 'Shutter Time': + self.add_input('LnxFloatSocket', 'Shutter Time', default_value=2.8333)#1 + if self.property0 == 'ISO': + self.add_input('LnxFloatSocket', 'ISO', default_value=100.0)#2 + if self.property0 == 'Exposure Compensation': + self.add_input('LnxFloatSocket', 'Exposure Compensation', default_value=0.0)#3 + if self.property0 == 'Fisheye Distortion': + self.add_input('LnxFloatSocket', 'Fisheye Distortion', default_value=0.01)#4 + if self.property0 == 'Auto Focus': + self.add_input('LnxBoolSocket', 'Auto Focus', default_value=True)#5 + if self.property0 == 'DoF Distance': + self.add_input('LnxFloatSocket', 'DoF Distance', default_value=10.0)#6 + if self.property0 == 'DoF Length': + self.add_input('LnxFloatSocket', 'DoF Length', default_value=160.0)#7 + if self.property0 == 'DoF F-Stop': + self.add_input('LnxFloatSocket', 'DoF F-Stop', default_value=128.0)#8 + if self.property0 == 'Tonemapping': + self.add_input('LnxBoolSocket', 'Tonemapping', default_value=False)#9 + if self.property0 == 'Distort': + self.add_input('LnxFloatSocket', 'Distort', default_value=2.0)#10 + if self.property0 == 'Film Grain': + self.add_input('LnxFloatSocket', 'Film Grain', default_value=2.0)#11 + if self.property0 == 'Sharpen': + self.add_input('LnxFloatSocket', 'Sharpen', default_value=0.25)#12 + if self.property0 == 'Vignette': + self.add_input('LnxFloatSocket', 'Vignette', default_value=0.7)#13 + if self.property0 == 'Exposure': + self.add_input('LnxFloatSocket', 'Exposure', default_value=1)#14 + + + property0: HaxeEnumProperty( + 'property0', + items = [('F-stop', 'F-stop', 'F-stop'), + ('Shutter Time', 'Shutter Time', 'Shutter Time'), + ('ISO', 'ISO', 'ISO'), + ('Exposure Compensation', 'Exposure Compensation', 'Exposure Compensation'), + ('Fisheye Distortion', 'Fisheye Distortion', 'Fisheye Distortion'), + ('Auto Focus', 'Auto Focus', 'Auto Focus'), + ('DoF Distance', 'DoF Distance', 'DoF Distance'), + ('DoF Length', 'DoF Length', 'DoF Length'), + ('DoF F-Stop', 'DoF F-Stop', 'DoF F-Stop'), + ('Tonemapping', 'Tonemapping', 'Tonemapping'), + ('Distort', 'Distort', 'Distort'), + ('Film Grain', 'Film Grain', 'Film Grain'), + ('Sharpen', 'Sharpen', 'Sharpen'), + ('Vignette', 'Vignette', 'Vignette'), + ('Exposure', 'Exposure', 'Exposure')], + name='', default='F-stop', update=remove_extra_inputs) + + def lnx_init(self, context): self.add_input('LnxNodeSocketAction', 'In') - self.add_input('LnxFloatSocket', 'F-stop', default_value=1.0)#0 - self.add_input('LnxFloatSocket', 'Shutter Time', default_value=2.8333)#1 - self.add_input('LnxFloatSocket', 'ISO', default_value=100.0)#2 - self.add_input('LnxFloatSocket', 'Exposure Compensation', default_value=0.0)#3 - self.add_input('LnxFloatSocket', 'Fisheye Distortion', default_value=0.01)#4 - self.add_input('LnxBoolSocket', 'Auto Focus', default_value=True)#5 - self.add_input('LnxFloatSocket', 'DoF Distance', default_value=10.0)#6 - self.add_input('LnxFloatSocket', 'DoF Length', default_value=160.0)#7 - self.add_input('LnxFloatSocket', 'DoF F-Stop', default_value=128.0)#8 - self.add_input('LnxBoolSocket', 'Tonemapping', default_value=False)#9 - self.add_input('LnxFloatSocket', 'Distort', default_value=2.0)#10 - self.add_input('LnxFloatSocket', 'Film Grain', default_value=2.0)#11 - self.add_input('LnxFloatSocket', 'Sharpen', default_value=0.25)#12 - self.add_input('LnxFloatSocket', 'Vignette', default_value=0.7)#13 + self.add_input('LnxFloatSocket', 'F-stop', default_value=1.0) self.add_output('LnxNodeSocketAction', 'Out') + def draw_buttons(self, context, layout): + layout.prop(self, 'property0') + def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.lnx_version not in range(0, 4): raise LookupError() From 00b580a4fa5a822a65e3201299ef75d34748c3b0 Mon Sep 17 00:00:00 2001 From: LeenkxTeam Date: Mon, 2 Jun 2025 20:06:50 +0000 Subject: [PATCH 92/92] Update leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py --- .../lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py index 208a7f6f..80e08733 100644 --- a/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_auto_exposure_settings.py @@ -1,4 +1,4 @@ -from lnx.logicnode.arm_nodes import * +from lnx.logicnode.lnx_nodes import * class AutoExposureGetNode(LnxLogicTreeNode): """Returns the auto exposure post-processing settings."""