Merge pull request 'main' (#94) from Onek8/LNXSDK:main into main

Reviewed-on: LeenkxTeam/LNXSDK#94
This commit is contained in:
2025-07-03 04:12:51 +00:00
9 changed files with 179 additions and 0 deletions

View File

@ -0,0 +1,17 @@
package leenkx.logicnode;
import aura.Aura;
import aura.Types;
class GetAudioPositionNode extends LogicNode {
public function new(tree: LogicTree) {
super(tree);
}
override function get(from: Int): Dynamic {
var audio = inputs[0].get();
if (audio == null || audio.channel == null) return 0.0;
return audio.channel.floatPosition / audio.channel.sampleRate;
}
}

View File

@ -0,0 +1,33 @@
package leenkx.logicnode;
#if lnx_audio
import iron.object.SpeakerObject;
import kha.audio1.AudioChannel;
#end
class GetPositionSpeakerNode extends LogicNode {
public function new(tree: LogicTree) {
super(tree);
}
override function get(from: Int): Dynamic {
#if lnx_audio
var object: SpeakerObject = cast(inputs[0].get(), SpeakerObject);
if (object == null || object.sound == null) return 0.0;
if (object.channels.length == 0) return 0.0;
var channel = object.channels[0];
var position = 0.0;
if (channel != null) {
position = @:privateAccess channel.get_position();
}
return position;
#else
return 0.0;
#end
}
}

View File

@ -0,0 +1,23 @@
package leenkx.logicnode;
import aura.Aura;
import aura.Types;
class SetAudioPositionNode extends LogicNode {
public function new(tree: LogicTree) {
super(tree);
}
override function run(from: Int) {
var audio = inputs[1].get();
if (audio == null) return;
var positionInSeconds:Float = inputs[2].get();
if (positionInSeconds < 0.0) positionInSeconds = 0.0;
audio.channel.floatPosition = positionInSeconds * audio.channel.sampleRate;
runOutput(0);
}
}

View File

@ -0,0 +1,39 @@
package leenkx.logicnode;
#if lnx_audio
import iron.object.SpeakerObject;
import kha.audio1.AudioChannel;
import iron.system.Audio;
#end
class SetPositionSpeakerNode extends LogicNode {
public function new(tree: LogicTree) {
super(tree);
}
override function run(from: Int) {
#if lnx_audio
var object: SpeakerObject = cast(inputs[1].get(), SpeakerObject);
if (object == null || object.sound == null) return;
var positionInSeconds:Float = inputs[2].get();
if (positionInSeconds < 0) positionInSeconds = 0;
var volume = object.data.volume;
var loop = object.data.loop;
var stream = object.data.stream;
object.stop();
var channel = Audio.play(object.sound, loop, stream);
if (channel != null) {
object.channels.push(channel);
channel.volume = volume;
@:privateAccess channel.set_position(positionInSeconds);
}
#end
runOutput(0);
}
}

View File

@ -0,0 +1,17 @@
from lnx.logicnode.lnx_nodes import *
class GetAudioPositionNode(LnxLogicTreeNode):
"""Gets the current playback position of 3D audio in seconds."""
bl_idname = 'LNGetAudioPositionNode'
bl_label = 'Get Audio Position'
bl_description = 'Gets the current playback position of 3D audio in seconds.'
lnx_category = '3D_Audio'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxDynamicSocket', 'Audio')
self.add_output('LnxFloatSocket', 'Position (seconds)')
def register():
add_category('3D_Audio', icon='SOUND')
GetAudioPositionNode.on_register()

View File

@ -0,0 +1,20 @@
from lnx.logicnode.lnx_nodes import *
class SetAudioPositionNode(LnxLogicTreeNode):
"""Sets the playback position of 3D audio. This node allows you to "scrub" through 3D audio by setting the current playback position to a specific time in seconds."""
bl_idname = 'LNSetAudioPositionNode'
bl_label = 'Set Audio Position'
bl_description = 'Sets the playback position of 3D audio'
lnx_category = '3D_Audio'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxDynamicSocket', 'Audio')
self.add_input('LnxFloatSocket', 'Position (seconds)')
self.add_output('LnxNodeSocketAction', 'Out')
def register():
add_category('3D_Audio', icon='SOUND')
SetAudioPositionNode.on_register()

View File

@ -0,0 +1,11 @@
from lnx.logicnode.lnx_nodes import *
class GetPositionSpeakerNode(LnxLogicTreeNode):
"""Gets the current playback position of the given speaker object in seconds."""
bl_idname = 'LNGetPositionSpeakerNode'
bl_label = 'Get Position Speaker'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketObject', 'Speaker')
self.add_output('LnxFloatSocket', 'Position (seconds)')

View File

@ -0,0 +1,17 @@
from lnx.logicnode.lnx_nodes import *
class SetPositionSpeakerNode(LnxLogicTreeNode):
"""Sets the playback position of the given speaker object.
This node allows you to "scrub" through audio by setting the current playback position
to a specific time in seconds. The speaker must be playing for this to take effect.
"""
bl_idname = 'LNSetPositionSpeakerNode'
bl_label = 'Set Position Speaker'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Speaker')
self.add_input('LnxFloatSocket', 'Position (seconds)')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -228,6 +228,8 @@ def parse_shader(node: bpy.types.Node, socket: bpy.types.NodeSocket) -> Tuple[st
'EMISSION',
'BSDF_GLASS',
'GLASS_BSDF',
'BSDF_REFRACTION',
'REFRACTION_BSDF',
'HOLDOUT',
'SUBSURFACE_SCATTERING',
'BSDF_TRANSLUCENT',