forked from LeenkxTeam/LNXSDK
Merge pull request 't3du [ Repe ] - World Nodes | Resolution PP | Texture Filtering' (#71) from Onek8/LNXSDK:main into main
Reviewed-on: LeenkxTeam/LNXSDK#71
This commit is contained in:
@ -1,26 +1,13 @@
|
|||||||
package leenkx.logicnode;
|
package leenkx.logicnode;
|
||||||
|
|
||||||
import iron.object.Object;
|
|
||||||
import iron.math.Vec4;
|
|
||||||
|
|
||||||
class GetWorldNode extends LogicNode {
|
class GetWorldNode extends LogicNode {
|
||||||
|
|
||||||
public var property0: String;
|
|
||||||
|
|
||||||
public function new(tree: LogicTree) {
|
public function new(tree: LogicTree) {
|
||||||
super(tree);
|
super(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
override function get(from: Int): Dynamic {
|
override function get(from: Int): Dynamic {
|
||||||
var object: Object = inputs[0].get();
|
trace(iron.Scene.active.world);
|
||||||
|
return iron.Scene.active.raw.world_ref;
|
||||||
if (object == null) return null;
|
|
||||||
|
|
||||||
return switch (property0) {
|
|
||||||
case "Right": object.transform.world.right();
|
|
||||||
case "Look": object.transform.world.look();
|
|
||||||
case "Up": object.transform.world.up();
|
|
||||||
default: null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
26
leenkx/Sources/leenkx/logicnode/GetWorldOrientationNode.hx
Normal file
26
leenkx/Sources/leenkx/logicnode/GetWorldOrientationNode.hx
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
import iron.object.Object;
|
||||||
|
import iron.math.Vec4;
|
||||||
|
|
||||||
|
class GetWorldNode extends LogicNode {
|
||||||
|
|
||||||
|
public var property0: String;
|
||||||
|
|
||||||
|
public function new(tree: LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function get(from: Int): Dynamic {
|
||||||
|
var object: Object = inputs[0].get();
|
||||||
|
|
||||||
|
if (object == null) return null;
|
||||||
|
|
||||||
|
return switch (property0) {
|
||||||
|
case "Right": object.transform.world.right();
|
||||||
|
case "Look": object.transform.world.look();
|
||||||
|
case "Up": object.transform.world.up();
|
||||||
|
default: null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
16
leenkx/Sources/leenkx/logicnode/ResolutionGetNode.hx
Normal file
16
leenkx/Sources/leenkx/logicnode/ResolutionGetNode.hx
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
class ResolutionGetNode extends LogicNode {
|
||||||
|
|
||||||
|
public function new(tree:LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function get(from:Int):Dynamic {
|
||||||
|
return switch (from) {
|
||||||
|
case 0: leenkx.renderpath.Postprocess.resolution_uniforms[0];
|
||||||
|
case 1: leenkx.renderpath.Postprocess.resolution_uniforms[1];
|
||||||
|
default: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
leenkx/Sources/leenkx/logicnode/ResolutionSetNode.hx
Normal file
33
leenkx/Sources/leenkx/logicnode/ResolutionSetNode.hx
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
import kha.graphics4.TextureFilter;
|
||||||
|
|
||||||
|
class ResolutionSetNode extends LogicNode {
|
||||||
|
|
||||||
|
public function new(tree:LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function run(from:Int) {
|
||||||
|
|
||||||
|
var size: Int = inputs[1].get();
|
||||||
|
var filter: Int = inputs[2].get();
|
||||||
|
|
||||||
|
#if rp_resolution_filter
|
||||||
|
if (filter == 0)
|
||||||
|
iron.object.Uniforms.defaultFilter = TextureFilter.LinearFilter;
|
||||||
|
else
|
||||||
|
iron.object.Uniforms.defaultFilter = TextureFilter.PointFilter;
|
||||||
|
|
||||||
|
leenkx.renderpath.Postprocess.resolution_uniforms[0] = size;
|
||||||
|
leenkx.renderpath.Postprocess.resolution_uniforms[1] = filter;
|
||||||
|
|
||||||
|
var npath = leenkx.renderpath.RenderPathCreator.get();
|
||||||
|
var world = iron.Scene.active.raw.world_ref;
|
||||||
|
npath.loadShader("shader_datas/World_" + world + "/World_" + world);
|
||||||
|
iron.RenderPath.setActive(npath);
|
||||||
|
#end
|
||||||
|
|
||||||
|
runOutput(0);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
import iron.object.MeshObject;
|
||||||
|
import iron.data.MaterialData;
|
||||||
|
|
||||||
|
class SetMaterialTextureFilterNode extends LogicNode {
|
||||||
|
|
||||||
|
public function new(tree: LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function run(from: Int) {
|
||||||
|
var object: MeshObject = inputs[1].get();
|
||||||
|
var mat: MaterialData = inputs[2].get();
|
||||||
|
var slot: Int = inputs[3].get();
|
||||||
|
var name: String = inputs[4].get();
|
||||||
|
var filter: Int = inputs[5].get();
|
||||||
|
|
||||||
|
if (object == null) return;
|
||||||
|
if (slot >= object.materials.length) return;
|
||||||
|
|
||||||
|
var mo = cast(object, iron.object.MeshObject);
|
||||||
|
|
||||||
|
for (i => node in mo.materials[slot].contexts[0].raw.bind_textures)
|
||||||
|
if (node.name == name){
|
||||||
|
var moImgt = mo.materials[slot].contexts[0].raw.bind_textures[i];
|
||||||
|
switch(filter){
|
||||||
|
case 0: //Linear
|
||||||
|
moImgt.min_filter = null;
|
||||||
|
moImgt.mag_filter = null;
|
||||||
|
moImgt.mipmap_filter = null;
|
||||||
|
moImgt.generate_mipmaps = null;
|
||||||
|
case 1: //Closest
|
||||||
|
moImgt.min_filter = 'point';
|
||||||
|
moImgt.mag_filter = 'point';
|
||||||
|
moImgt.mipmap_filter = null;
|
||||||
|
moImgt.generate_mipmaps = null;
|
||||||
|
case 2: //Cubic
|
||||||
|
moImgt.min_filter = null;
|
||||||
|
moImgt.mag_filter = null;
|
||||||
|
moImgt.mipmap_filter = 'linear';
|
||||||
|
moImgt.generate_mipmaps = true;
|
||||||
|
case 3: //Smart
|
||||||
|
moImgt.min_filter = 'anisotropic';
|
||||||
|
moImgt.mag_filter = null;
|
||||||
|
moImgt.mipmap_filter = 'linear';
|
||||||
|
moImgt.generate_mipmaps = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
runOutput(0);
|
||||||
|
}
|
||||||
|
}
|
40
leenkx/Sources/leenkx/logicnode/SetWorldNode.hx
Normal file
40
leenkx/Sources/leenkx/logicnode/SetWorldNode.hx
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
class SetWorldNode extends LogicNode {
|
||||||
|
|
||||||
|
public function new(tree: LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function run(from: Int) {
|
||||||
|
var world: String = inputs[1].get();
|
||||||
|
|
||||||
|
if (world != null){
|
||||||
|
|
||||||
|
//check if world shader data exists
|
||||||
|
var file: String = 'World_'+world+'_data';
|
||||||
|
#if lnx_json
|
||||||
|
file += ".json";
|
||||||
|
#elseif lnx_compress
|
||||||
|
file += ".lz4";
|
||||||
|
#else
|
||||||
|
file += '.lnx';
|
||||||
|
#end
|
||||||
|
|
||||||
|
var exists: Bool = false;
|
||||||
|
|
||||||
|
iron.data.Data.getBlob(file, function(b: kha.Blob) {
|
||||||
|
if (b != null) exists = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
assert(Error, exists == true, "World must be either associated to a scene or have fake user");
|
||||||
|
|
||||||
|
iron.Scene.active.raw.world_ref = world;
|
||||||
|
var npath = leenkx.renderpath.RenderPathCreator.get();
|
||||||
|
npath.loadShader("shader_datas/World_" + world + "/World_" + world);
|
||||||
|
iron.RenderPath.setActive(npath);
|
||||||
|
}
|
||||||
|
|
||||||
|
runOutput(0);
|
||||||
|
}
|
||||||
|
}
|
@ -785,7 +785,11 @@ class Inc {
|
|||||||
|
|
||||||
public static inline function getDisplayp(): Null<Int> {
|
public static inline function getDisplayp(): Null<Int> {
|
||||||
#if rp_resolution_filter // Custom resolution set
|
#if rp_resolution_filter // Custom resolution set
|
||||||
|
#if rp_pp
|
||||||
|
return leenkx.renderpath.Postprocess.resolution_uniforms[0];
|
||||||
|
#else
|
||||||
return Main.resolutionSize;
|
return Main.resolutionSize;
|
||||||
|
#end
|
||||||
#else
|
#else
|
||||||
return null;
|
return null;
|
||||||
#end
|
#end
|
||||||
|
@ -133,6 +133,11 @@ class Postprocess {
|
|||||||
[50.0] //2: Volumetric Fog Amount B
|
[50.0] //2: Volumetric Fog Amount B
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public static var resolution_uniforms = [
|
||||||
|
720, //0: Size
|
||||||
|
0 //1: Filter
|
||||||
|
];
|
||||||
|
|
||||||
public static function vec3Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 {
|
public static function vec3Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 {
|
||||||
var v:Vec4 = null;
|
var v:Vec4 = null;
|
||||||
|
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class SetMaterialTextureFilterNode(LnxLogicTreeNode):
|
||||||
|
"""Sets texture filter interpolation."""
|
||||||
|
bl_idname = 'LNSetMaterialTextureFilterNode'
|
||||||
|
bl_label = 'Set Object Material Texture Filter'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_input('LnxNodeSocketAction', 'In')
|
||||||
|
self.add_input('LnxNodeSocketObject', 'Object')
|
||||||
|
self.add_input('LnxDynamicSocket', 'Material')
|
||||||
|
self.add_input('LnxIntSocket', 'Slot')
|
||||||
|
self.add_input('LnxStringSocket', 'Node')
|
||||||
|
self.add_input('LnxIntSocket', 'Texture Filter')
|
||||||
|
|
||||||
|
self.add_output('LnxNodeSocketAction', 'Out')
|
||||||
|
|
||||||
|
def draw_buttons(self, context, layout):
|
||||||
|
layout.label(text='Tex Filter 0: Linear')
|
||||||
|
layout.label(text='Tex Filter 1: Closest')
|
||||||
|
layout.label(text='Tex Filter 2: Cubic')
|
||||||
|
layout.label(text='Tex Filter 3: Smart')
|
@ -0,0 +1,12 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class ResolutionGetNode(LnxLogicTreeNode):
|
||||||
|
"""Returns the resolution parameters.
|
||||||
|
"""
|
||||||
|
bl_idname = 'LNResolutionGetNode'
|
||||||
|
bl_label = 'Get Resolution Settings'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_output('LnxIntSocket', 'Size')
|
||||||
|
self.add_output('LnxIntSocket', 'Filter')
|
@ -0,0 +1,20 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class ResolutionSetNode(LnxLogicTreeNode):
|
||||||
|
"""Set the resolution post-processing settings.
|
||||||
|
Filter 0: Lineal 1: Closest
|
||||||
|
"""
|
||||||
|
bl_idname = 'LNResolutionSetNode'
|
||||||
|
bl_label = 'Set Resolution Settings'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_input('LnxNodeSocketAction', 'In')
|
||||||
|
self.add_input('LnxIntSocket', 'Size', default_value=720)
|
||||||
|
self.add_input('LnxIntSocket', 'Filter', default_value=0)
|
||||||
|
|
||||||
|
self.add_output('LnxNodeSocketAction', 'Out')
|
||||||
|
|
||||||
|
def draw_buttons(self, context, layout):
|
||||||
|
layout.label(text="Type 0: Lineal")
|
||||||
|
layout.label(text="Type 1: Closest")
|
@ -1,8 +1,8 @@
|
|||||||
from lnx.logicnode.lnx_nodes import *
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
class GetWorldNode(LnxLogicTreeNode):
|
class GetWorldOrientationNode(LnxLogicTreeNode):
|
||||||
"""Returns the world orientation of the given object."""
|
"""Returns the world orientation of the given object."""
|
||||||
bl_idname = 'LNGetWorldNode'
|
bl_idname = 'LNGetWorldOrientationNode'
|
||||||
bl_label = 'Get World Orientation'
|
bl_label = 'Get World Orientation'
|
||||||
lnx_section = 'rotation'
|
lnx_section = 'rotation'
|
||||||
lnx_version = 1
|
lnx_version = 1
|
||||||
|
10
leenkx/blender/lnx/logicnode/world/LN_get_world.py
Normal file
10
leenkx/blender/lnx/logicnode/world/LN_get_world.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class GetWorldNode(LnxLogicTreeNode):
|
||||||
|
"""Gets the World of the active scene."""
|
||||||
|
bl_idname = 'LNGetWorldNode'
|
||||||
|
bl_label = 'Get World'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_output('LnxStringSocket', 'World')
|
13
leenkx/blender/lnx/logicnode/world/LN_set_world.py
Normal file
13
leenkx/blender/lnx/logicnode/world/LN_set_world.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class SetWorldNode(LnxLogicTreeNode):
|
||||||
|
"""Sets the World of the active scene."""
|
||||||
|
bl_idname = 'LNSetWorldNode'
|
||||||
|
bl_label = 'Set World'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_input('LnxNodeSocketAction', 'In')
|
||||||
|
self.add_input('LnxStringSocket', 'World')
|
||||||
|
|
||||||
|
self.add_output('LnxNodeSocketAction', 'Out')
|
@ -47,11 +47,20 @@ def build():
|
|||||||
|
|
||||||
with write_probes.setup_envmap_render():
|
with write_probes.setup_envmap_render():
|
||||||
|
|
||||||
for scene in bpy.data.scenes:
|
#for scene in bpy.data.scenes:
|
||||||
world = scene.world
|
for world in bpy.data.worlds:
|
||||||
|
#world = scene.world
|
||||||
|
|
||||||
# Only export worlds from enabled scenes and only once per world
|
assigned = False;
|
||||||
if scene.lnx_export and world is not None and world not in worlds:
|
for scene in bpy.data.scenes:
|
||||||
|
if scene.lnx_export and scene.world is not None:
|
||||||
|
if scene.world.name == world.name:
|
||||||
|
assigned = True;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if scene.lnx_export and world is not None and world not in worlds:
|
||||||
|
# Only export worlds from enabled scenes and with fake users
|
||||||
|
if (world.use_fake_user and world.name != 'Lnx') or assigned:
|
||||||
worlds.append(world)
|
worlds.append(world)
|
||||||
|
|
||||||
world.lnx_envtex_name = ''
|
world.lnx_envtex_name = ''
|
||||||
|
@ -450,9 +450,10 @@ class LnxRPListItem(bpy.types.PropertyGroup):
|
|||||||
lnx_ssrs: BoolProperty(name="SSRS", description="Screen-space ray-traced shadows", default=False, update=assets.invalidate_shader_cache)
|
lnx_ssrs: BoolProperty(name="SSRS", description="Screen-space ray-traced shadows", default=False, update=assets.invalidate_shader_cache)
|
||||||
lnx_micro_shadowing: BoolProperty(name="Micro Shadowing", description="Use the shaders' occlusion parameter to compute micro shadowing for the scene's sun lamp. This option is not available for render paths using mobile or solid material models", default=False, update=assets.invalidate_shader_cache)
|
lnx_micro_shadowing: BoolProperty(name="Micro Shadowing", description="Use the shaders' occlusion parameter to compute micro shadowing for the scene's sun lamp. This option is not available for render paths using mobile or solid material models", default=False, update=assets.invalidate_shader_cache)
|
||||||
lnx_texture_filter: EnumProperty(
|
lnx_texture_filter: EnumProperty(
|
||||||
items=[('Anisotropic', 'Anisotropic', 'Anisotropic'),
|
items=[('Linear', 'Linear', 'Linear'),
|
||||||
('Linear', 'Linear', 'Linear'),
|
|
||||||
('Point', 'Closest', 'Point'),
|
('Point', 'Closest', 'Point'),
|
||||||
|
('Cubic', 'Cubic', 'Cubic'),
|
||||||
|
('Anisotropic', 'Smart', 'Anisotropic'),
|
||||||
('Manual', 'Manual', 'Manual')],
|
('Manual', 'Manual', 'Manual')],
|
||||||
name="Texture Filtering", description="Set Manual to honor interpolation setting on Image Texture node", default='Anisotropic')
|
name="Texture Filtering", description="Set Manual to honor interpolation setting on Image Texture node", default='Anisotropic')
|
||||||
lnx_material_model: EnumProperty(
|
lnx_material_model: EnumProperty(
|
||||||
|
Reference in New Issue
Block a user