forked from LeenkxTeam/LNXSDK
merge upstream
This commit is contained in:
@ -783,6 +783,11 @@ class Scene {
|
|||||||
if (o.tilesheet_ref != null) {
|
if (o.tilesheet_ref != null) {
|
||||||
cast(object, MeshObject).setupTilesheet(sceneName, o.tilesheet_ref, o.tilesheet_action_ref);
|
cast(object, MeshObject).setupTilesheet(sceneName, o.tilesheet_ref, o.tilesheet_action_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (o.camera_list != null){
|
||||||
|
cast(object, MeshObject).cameraList = o.camera_list;
|
||||||
|
}
|
||||||
|
|
||||||
returnObject(object, o, done);
|
returnObject(object, o, done);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -441,6 +441,7 @@ typedef TObj = {
|
|||||||
@:optional public var traits: Array<TTrait>;
|
@:optional public var traits: Array<TTrait>;
|
||||||
@:optional public var properties: Array<TProperty>;
|
@:optional public var properties: Array<TProperty>;
|
||||||
@:optional public var vertex_groups: Array<TVertex_groups>;
|
@:optional public var vertex_groups: Array<TVertex_groups>;
|
||||||
|
@:optional public var camera_list: Array<String>;
|
||||||
@:optional public var constraints: Array<TConstraint>;
|
@:optional public var constraints: Array<TConstraint>;
|
||||||
@:optional public var dimensions: Float32Array; // Geometry objects
|
@:optional public var dimensions: Float32Array; // Geometry objects
|
||||||
@:optional public var object_actions: Array<String>;
|
@:optional public var object_actions: Array<String>;
|
||||||
|
@ -24,6 +24,7 @@ class MeshObject extends Object {
|
|||||||
public var render_emitter = true;
|
public var render_emitter = true;
|
||||||
#end
|
#end
|
||||||
public var cameraDistance: Float;
|
public var cameraDistance: Float;
|
||||||
|
public var cameraList: Array<String> = null;
|
||||||
public var screenSize = 0.0;
|
public var screenSize = 0.0;
|
||||||
public var frustumCulling = true;
|
public var frustumCulling = true;
|
||||||
public var activeTilesheet: Tilesheet = null;
|
public var activeTilesheet: Tilesheet = null;
|
||||||
@ -235,6 +236,8 @@ class MeshObject extends Object {
|
|||||||
if (cullMesh(context, Scene.active.camera, RenderPath.active.light)) return;
|
if (cullMesh(context, Scene.active.camera, RenderPath.active.light)) return;
|
||||||
var meshContext = raw != null ? context == "mesh" : false;
|
var meshContext = raw != null ? context == "mesh" : false;
|
||||||
|
|
||||||
|
if (cameraList != null && cameraList.indexOf(Scene.active.camera.name) < 0) return;
|
||||||
|
|
||||||
#if lnx_particles
|
#if lnx_particles
|
||||||
if (raw != null && raw.is_particle && particleOwner == null) return; // Instancing not yet set-up by particle system owner
|
if (raw != null && raw.is_particle && particleOwner == null) return; // Instancing not yet set-up by particle system owner
|
||||||
if (particleSystems != null && meshContext) {
|
if (particleSystems != null && meshContext) {
|
||||||
@ -245,6 +248,7 @@ class MeshObject extends Object {
|
|||||||
Scene.active.spawnObject(psys.data.raw.instance_object, null, function(o: Object) {
|
Scene.active.spawnObject(psys.data.raw.instance_object, null, function(o: Object) {
|
||||||
if (o != null) {
|
if (o != null) {
|
||||||
var c: MeshObject = cast o;
|
var c: MeshObject = cast o;
|
||||||
|
c.cameraList = this.cameraList;
|
||||||
particleChildren.push(c);
|
particleChildren.push(c);
|
||||||
c.particleOwner = this;
|
c.particleOwner = this;
|
||||||
c.particleIndex = particleChildren.length - 1;
|
c.particleIndex = particleChildren.length - 1;
|
||||||
|
19
leenkx/Sources/leenkx/logicnode/GetCameraRenderFilterNode.hx
Normal file
19
leenkx/Sources/leenkx/logicnode/GetCameraRenderFilterNode.hx
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
import iron.object.MeshObject;
|
||||||
|
import iron.object.CameraObject;
|
||||||
|
|
||||||
|
class GetCameraRenderFilterNode extends LogicNode {
|
||||||
|
|
||||||
|
public function new(tree: LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function get(from: Int): Dynamic {
|
||||||
|
var mo: MeshObject = cast inputs[0].get();
|
||||||
|
|
||||||
|
if (mo == null) return null;
|
||||||
|
|
||||||
|
return mo.cameraList;
|
||||||
|
}
|
||||||
|
}
|
38
leenkx/Sources/leenkx/logicnode/SetCameraRenderFilterNode.hx
Normal file
38
leenkx/Sources/leenkx/logicnode/SetCameraRenderFilterNode.hx
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package leenkx.logicnode;
|
||||||
|
|
||||||
|
import iron.object.MeshObject;
|
||||||
|
import iron.object.CameraObject;
|
||||||
|
|
||||||
|
class SetCameraRenderFilterNode extends LogicNode {
|
||||||
|
|
||||||
|
public var property0: String;
|
||||||
|
|
||||||
|
public function new(tree: LogicTree) {
|
||||||
|
super(tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
override function run(from: Int) {
|
||||||
|
var mo: MeshObject = cast inputs[1].get();
|
||||||
|
var camera: CameraObject = inputs[2].get();
|
||||||
|
|
||||||
|
assert(Error, Std.isOfType(camera, CameraObject), "Camera must be a camera object!");
|
||||||
|
|
||||||
|
if (camera == null || mo == null) return;
|
||||||
|
|
||||||
|
if (property0 == 'Add'){
|
||||||
|
if (mo.cameraList == null || mo.cameraList.indexOf(camera.name) == -1){
|
||||||
|
if (mo.cameraList == null) mo.cameraList = [];
|
||||||
|
mo.cameraList.push(camera.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (mo.cameraList != null){
|
||||||
|
mo.cameraList.remove(camera.name);
|
||||||
|
if (mo.cameraList.length == 0)
|
||||||
|
mo.cameraList = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runOutput(0);
|
||||||
|
}
|
||||||
|
}
|
@ -835,6 +835,13 @@ class LeenkxExporter:
|
|||||||
}
|
}
|
||||||
out_object['vertex_groups'].append(out_vertex_groups)
|
out_object['vertex_groups'].append(out_vertex_groups)
|
||||||
|
|
||||||
|
if len(bobject.lnx_camera_list) > 0:
|
||||||
|
out_camera_list = []
|
||||||
|
for camera in bobject.lnx_camera_list:
|
||||||
|
if camera.lnx_camera_object_ptr != None:
|
||||||
|
out_camera_list.append(camera.lnx_camera_object_ptr.name)
|
||||||
|
if len(out_camera_list) > 0:
|
||||||
|
out_object['camera_list'] = out_camera_list
|
||||||
|
|
||||||
if len(bobject.lnx_propertylist) > 0:
|
if len(bobject.lnx_propertylist) > 0:
|
||||||
out_object['properties'] = []
|
out_object['properties'] = []
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class GetCameraRenderFilterNode(LnxLogicTreeNode):
|
||||||
|
"""
|
||||||
|
Gets Camera Render Filter array with the names of the cameras
|
||||||
|
that can render the mesh. If null all cameras can render the mesh.
|
||||||
|
"""
|
||||||
|
bl_idname = 'LNGetCameraRenderFilterNode'
|
||||||
|
bl_label = 'Get Object Camera Render Filter'
|
||||||
|
lnx_section = 'camera'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_input('LnxNodeSocketObject', 'Object')
|
||||||
|
self.add_output('LnxNodeSocketArray', 'Array')
|
@ -0,0 +1,29 @@
|
|||||||
|
from lnx.logicnode.lnx_nodes import *
|
||||||
|
|
||||||
|
class SetCameraRenderFilterNode(LnxLogicTreeNode):
|
||||||
|
"""
|
||||||
|
Sets Camera Render Filter array with the names of the cameras
|
||||||
|
that can render the mesh. If null all cameras can render the mesh.
|
||||||
|
A camera can be added or removed from the arraw list.
|
||||||
|
"""
|
||||||
|
bl_idname = 'LNSetCameraRenderFilterNode'
|
||||||
|
bl_label = 'Set Object Camera Render Filter'
|
||||||
|
lnx_section = 'camera'
|
||||||
|
lnx_version = 1
|
||||||
|
|
||||||
|
property0: HaxeEnumProperty(
|
||||||
|
'property0',
|
||||||
|
items = [('Add', 'Add', 'Add'),
|
||||||
|
('Remove', 'Remove', 'Remove')],
|
||||||
|
name='', default='Add', update='')
|
||||||
|
|
||||||
|
|
||||||
|
def lnx_init(self, context):
|
||||||
|
self.add_input('LnxNodeSocketAction', 'In')
|
||||||
|
self.add_input('LnxNodeSocketObject', 'Object')
|
||||||
|
self.add_input('LnxNodeSocketObject', 'Camera')
|
||||||
|
|
||||||
|
self.add_output('LnxNodeSocketAction', 'Out')
|
||||||
|
|
||||||
|
def draw_buttons(self, context, layout):
|
||||||
|
layout.prop(self, 'property0')
|
141
leenkx/blender/lnx/props_camera_render_filter.py
Normal file
141
leenkx/blender/lnx/props_camera_render_filter.py
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
import bpy
|
||||||
|
from bpy.props import *
|
||||||
|
|
||||||
|
class LNX_UL_CameraList(bpy.types.UIList):
|
||||||
|
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
|
||||||
|
layout.prop_search(item, "lnx_camera_object_ptr", bpy.data, "objects", text="", icon='VIEW_CAMERA')
|
||||||
|
|
||||||
|
class LNX_CameraListItem(bpy.types.PropertyGroup):
|
||||||
|
lnx_camera_object_ptr: bpy.props.PointerProperty(
|
||||||
|
type=bpy.types.Object,
|
||||||
|
name="Camera Object",
|
||||||
|
poll=lambda self, obj_to_check: obj_to_check.type == 'CAMERA' and \
|
||||||
|
(bpy.context.object is None or \
|
||||||
|
not hasattr(bpy.context.object, 'lnx_camera_list') or \
|
||||||
|
(obj_to_check.name not in [
|
||||||
|
item.lnx_camera_object_ptr.name
|
||||||
|
for item in bpy.context.object.lnx_camera_list
|
||||||
|
if item.lnx_camera_object_ptr and item != self
|
||||||
|
]))
|
||||||
|
)
|
||||||
|
|
||||||
|
class LNX_PT_LeenkxCameraRenderFilter(bpy.types.Panel):
|
||||||
|
bl_label = "Leenkx Camera Render Filter"
|
||||||
|
bl_idname = "LNX_PT_LeenkxCameraRenderFilter"
|
||||||
|
bl_space_type = 'PROPERTIES'
|
||||||
|
bl_region_type = 'WINDOW'
|
||||||
|
bl_context = "data"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
return context.object is not None and context.object.type == 'MESH'
|
||||||
|
|
||||||
|
def draw(self, context):
|
||||||
|
layout = self.layout
|
||||||
|
obj = context.object
|
||||||
|
|
||||||
|
row = layout.row()
|
||||||
|
|
||||||
|
col = row.column()
|
||||||
|
col.template_list(
|
||||||
|
"LNX_UL_CameraList",
|
||||||
|
"",
|
||||||
|
obj,
|
||||||
|
"lnx_camera_list",
|
||||||
|
obj,
|
||||||
|
"lnx_active_camera_index",
|
||||||
|
rows=5
|
||||||
|
)
|
||||||
|
|
||||||
|
col = row.column(align=True)
|
||||||
|
col.operator("lnx.add_camera", icon='ADD', text="")
|
||||||
|
|
||||||
|
if obj.lnx_camera_list and obj.lnx_active_camera_index >= 0 and obj.lnx_active_camera_index < len(obj.lnx_camera_list):
|
||||||
|
op_remove = col.operator("lnx.remove_camera", icon='REMOVE', text="")
|
||||||
|
op_remove.lnx_index = obj.lnx_active_camera_index
|
||||||
|
|
||||||
|
op_up = col.operator("lnx.move_camera", icon='TRIA_UP', text="")
|
||||||
|
op_up.lnx_index = obj.lnx_active_camera_index
|
||||||
|
op_up.direction = 'UP'
|
||||||
|
|
||||||
|
op_down = col.operator("lnx.move_camera", icon='TRIA_DOWN', text="")
|
||||||
|
op_down.lnx_index = obj.lnx_active_camera_index
|
||||||
|
op_down.direction = 'DOWN'
|
||||||
|
|
||||||
|
class LNX_OT_AddCamera(bpy.types.Operator):
|
||||||
|
bl_idname = "lnx.add_camera"
|
||||||
|
bl_label = "Add Camera"
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
obj = context.object
|
||||||
|
|
||||||
|
new_item = obj.lnx_camera_list.add()
|
||||||
|
obj.lnx_active_camera_index = len(obj.lnx_camera_list) - 1
|
||||||
|
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
class LNX_OT_RemoveCamera(bpy.types.Operator):
|
||||||
|
bl_idname = "lnx.remove_camera"
|
||||||
|
bl_label = "Remove Camera"
|
||||||
|
|
||||||
|
lnx_index: bpy.props.IntProperty()
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
obj = context.object
|
||||||
|
if self.lnx_index < len(obj.lnx_camera_list):
|
||||||
|
obj.lnx_camera_list.remove(self.lnx_index)
|
||||||
|
if obj.lnx_active_camera_index >= len(obj.lnx_camera_list):
|
||||||
|
obj.lnx_active_camera_index = len(obj.lnx_camera_list) - 1
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
class LNX_OT_MoveCamera(bpy.types.Operator):
|
||||||
|
bl_idname = "lnx.move_camera"
|
||||||
|
bl_label = "Move Camera"
|
||||||
|
|
||||||
|
lnx_index: bpy.props.IntProperty()
|
||||||
|
direction: bpy.props.EnumProperty(
|
||||||
|
items=[('UP', "Up", "Move camera up"),
|
||||||
|
('DOWN', "Down", "Move camera down")],
|
||||||
|
default='UP'
|
||||||
|
)
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
obj = context.object
|
||||||
|
camera_list = obj.lnx_camera_list
|
||||||
|
target_index = -1
|
||||||
|
|
||||||
|
if self.direction == 'UP':
|
||||||
|
if self.lnx_index > 0:
|
||||||
|
target_index = self.lnx_index - 1
|
||||||
|
elif self.direction == 'DOWN':
|
||||||
|
if self.lnx_index < len(camera_list) - 1:
|
||||||
|
target_index = self.lnx_index + 1
|
||||||
|
|
||||||
|
if target_index != -1:
|
||||||
|
camera_list.move(self.lnx_index, target_index)
|
||||||
|
obj.lnx_active_camera_index = target_index
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
def register():
|
||||||
|
bpy.utils.register_class(LNX_UL_CameraList)
|
||||||
|
bpy.utils.register_class(LNX_CameraListItem)
|
||||||
|
bpy.utils.register_class(LNX_PT_LeenkxCameraRenderFilter)
|
||||||
|
bpy.utils.register_class(LNX_OT_AddCamera)
|
||||||
|
bpy.utils.register_class(LNX_OT_RemoveCamera)
|
||||||
|
bpy.utils.register_class(LNX_OT_MoveCamera)
|
||||||
|
|
||||||
|
bpy.types.Object.lnx_camera_list = bpy.props.CollectionProperty(type=LNX_CameraListItem)
|
||||||
|
bpy.types.Object.lnx_active_camera_index = bpy.props.IntProperty(name="Active Camera Index", default=-1)
|
||||||
|
|
||||||
|
def unregister():
|
||||||
|
bpy.utils.unregister_class(LNX_UL_CameraList)
|
||||||
|
bpy.utils.unregister_class(LNX_CameraListItem)
|
||||||
|
bpy.utils.unregister_class(LNX_PT_LeenkxCameraRenderFilter)
|
||||||
|
bpy.utils.unregister_class(LNX_OT_AddCamera)
|
||||||
|
bpy.utils.unregister_class(LNX_OT_RemoveCamera)
|
||||||
|
bpy.utils.unregister_class(LNX_OT_MoveCamera)
|
||||||
|
|
||||||
|
if hasattr(bpy.types.Object, "lnx_camera_list"):
|
||||||
|
del bpy.types.Object.lnx_camera_list
|
||||||
|
if hasattr(bpy.types.Object, "lnx_active_camera_index"):
|
||||||
|
del bpy.types.Object.lnx_active_camera_index
|
@ -16,6 +16,7 @@ import lnx.props_properties
|
|||||||
import lnx.props_collision_filter_mask
|
import lnx.props_collision_filter_mask
|
||||||
import lnx.props
|
import lnx.props
|
||||||
import lnx.props_ui
|
import lnx.props_ui
|
||||||
|
import lnx.props_camera_render_filter
|
||||||
import lnx.handlers
|
import lnx.handlers
|
||||||
import lnx.utils
|
import lnx.utils
|
||||||
import lnx.keymap
|
import lnx.keymap
|
||||||
@ -44,6 +45,7 @@ if lnx.is_reload(__name__):
|
|||||||
lnx.props_collision_filter_mask = lnx.reload_module(lnx.props_collision_filter_mask)
|
lnx.props_collision_filter_mask = lnx.reload_module(lnx.props_collision_filter_mask)
|
||||||
lnx.props = lnx.reload_module(lnx.props)
|
lnx.props = lnx.reload_module(lnx.props)
|
||||||
lnx.props_ui = lnx.reload_module(lnx.props_ui)
|
lnx.props_ui = lnx.reload_module(lnx.props_ui)
|
||||||
|
lnx.props_camera_render_filter = lnx.reload_module(lnx.props_camera_render_filter)
|
||||||
lnx.handlers = lnx.reload_module(lnx.handlers)
|
lnx.handlers = lnx.reload_module(lnx.handlers)
|
||||||
lnx.utils = lnx.reload_module(lnx.utils)
|
lnx.utils = lnx.reload_module(lnx.utils)
|
||||||
lnx.keymap = lnx.reload_module(lnx.keymap)
|
lnx.keymap = lnx.reload_module(lnx.keymap)
|
||||||
@ -68,6 +70,7 @@ def register(local_sdk=False):
|
|||||||
lnx.props_properties.register()
|
lnx.props_properties.register()
|
||||||
lnx.props.register()
|
lnx.props.register()
|
||||||
lnx.props_ui.register()
|
lnx.props_ui.register()
|
||||||
|
lnx.props_camera_render_filter.register()
|
||||||
lnx.nodes_logic.register()
|
lnx.nodes_logic.register()
|
||||||
lnx.nodes_material.register()
|
lnx.nodes_material.register()
|
||||||
lnx.keymap.register()
|
lnx.keymap.register()
|
||||||
@ -100,3 +103,4 @@ def unregister():
|
|||||||
lnx.props_renderpath.unregister()
|
lnx.props_renderpath.unregister()
|
||||||
lnx.props_properties.unregister()
|
lnx.props_properties.unregister()
|
||||||
lnx.props_collision_filter_mask.unregister()
|
lnx.props_collision_filter_mask.unregister()
|
||||||
|
lnx.props_camera_render_filter.unregister()
|
||||||
|
Reference in New Issue
Block a user