forked from LeenkxTeam/LNXSDK
merge upstream
This commit is contained in:
@ -783,6 +783,11 @@ class Scene {
|
||||
if (o.tilesheet_ref != null) {
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
@ -441,6 +441,7 @@ typedef TObj = {
|
||||
@:optional public var traits: Array<TTrait>;
|
||||
@:optional public var properties: Array<TProperty>;
|
||||
@:optional public var vertex_groups: Array<TVertex_groups>;
|
||||
@:optional public var camera_list: Array<String>;
|
||||
@:optional public var constraints: Array<TConstraint>;
|
||||
@:optional public var dimensions: Float32Array; // Geometry objects
|
||||
@:optional public var object_actions: Array<String>;
|
||||
|
@ -24,6 +24,7 @@ class MeshObject extends Object {
|
||||
public var render_emitter = true;
|
||||
#end
|
||||
public var cameraDistance: Float;
|
||||
public var cameraList: Array<String> = null;
|
||||
public var screenSize = 0.0;
|
||||
public var frustumCulling = true;
|
||||
public var activeTilesheet: Tilesheet = null;
|
||||
@ -235,6 +236,8 @@ class MeshObject extends Object {
|
||||
if (cullMesh(context, Scene.active.camera, RenderPath.active.light)) return;
|
||||
var meshContext = raw != null ? context == "mesh" : false;
|
||||
|
||||
if (cameraList != null && cameraList.indexOf(Scene.active.camera.name) < 0) return;
|
||||
|
||||
#if lnx_particles
|
||||
if (raw != null && raw.is_particle && particleOwner == null) return; // Instancing not yet set-up by particle system owner
|
||||
if (particleSystems != null && meshContext) {
|
||||
@ -245,6 +248,7 @@ class MeshObject extends Object {
|
||||
Scene.active.spawnObject(psys.data.raw.instance_object, null, function(o: Object) {
|
||||
if (o != null) {
|
||||
var c: MeshObject = cast o;
|
||||
c.cameraList = this.cameraList;
|
||||
particleChildren.push(c);
|
||||
c.particleOwner = this;
|
||||
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)
|
||||
|
||||
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:
|
||||
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
|
||||
import lnx.props_ui
|
||||
import lnx.props_camera_render_filter
|
||||
import lnx.handlers
|
||||
import lnx.utils
|
||||
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 = lnx.reload_module(lnx.props)
|
||||
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.utils = lnx.reload_module(lnx.utils)
|
||||
lnx.keymap = lnx.reload_module(lnx.keymap)
|
||||
@ -68,6 +70,7 @@ def register(local_sdk=False):
|
||||
lnx.props_properties.register()
|
||||
lnx.props.register()
|
||||
lnx.props_ui.register()
|
||||
lnx.props_camera_render_filter.register()
|
||||
lnx.nodes_logic.register()
|
||||
lnx.nodes_material.register()
|
||||
lnx.keymap.register()
|
||||
@ -100,3 +103,4 @@ def unregister():
|
||||
lnx.props_renderpath.unregister()
|
||||
lnx.props_properties.unregister()
|
||||
lnx.props_collision_filter_mask.unregister()
|
||||
lnx.props_camera_render_filter.unregister()
|
||||
|
Reference in New Issue
Block a user