From fe4a58e8641fe7acccdff2ccc0cc894a3444d254 Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Mon, 30 Dec 2024 11:28:59 +0800 Subject: [PATCH] feat: add CKLight support and apply BMap changes to Python and CSharp bindings. - add CKLight and CKTargetLight in BMap bindings - apply BMap changes, for example, the rename of BM3dObject_ prefix to BM3dEntity_, to BMap bindings. --- BMapBindings/BMapSharp/BMapSharp/BMap.cs | 202 ++++++++++++++++-- .../BMapSharp/BMapSharp/BMapWrapper.cs | 60 +++++- .../BMapSharp/BMapSharp/VirtoolsTypes.cs | 7 + .../BMapSharp/BMapSharpTestbench/Program.cs | 70 +++--- BMapBindings/PyBMap/PyBMap/bmap.py | 148 +++++++++++-- BMapBindings/PyBMap/PyBMap/bmap_wrapper.py | 68 +++++- BMapBindings/PyBMap/PyBMap/virtools_types.py | 9 + BMapBindings/PyBMap/testbench.py | 67 +++--- CodeGen/BMapBindings/CSharpWriter.java | 1 + CodeGen/BMapBindings/PythonWriter.java | 1 + 10 files changed, 536 insertions(+), 97 deletions(-) diff --git a/BMapBindings/BMapSharp/BMapSharp/BMap.cs b/BMapBindings/BMapSharp/BMapSharp/BMap.cs index cf304e5..b80f62e 100644 --- a/BMapBindings/BMapSharp/BMapSharp/BMap.cs +++ b/BMapBindings/BMapSharp/BMapSharp/BMap.cs @@ -453,6 +453,28 @@ namespace BMapSharp { [DllImport(g_DllName, EntryPoint = "BMFile_CreateTexture", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] internal static extern bool BMFile_CreateTexture([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [Out, MarshalAs(UnmanagedType.U4)] out uint out_id); + /// BMFile_GetTargetLightCount + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CKDWORD. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMFile_GetTargetLightCount", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMFile_GetTargetLightCount([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [Out, MarshalAs(UnmanagedType.U4)] out uint out_count); + /// BMFile_GetTargetLight + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CKDWORD. + /// Type: LibCmo::CK2::CK_ID. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMFile_GetTargetLight", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMFile_GetTargetLight([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint idx, [Out, MarshalAs(UnmanagedType.U4)] out uint out_id); + /// BMFile_CreateTargetLight + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMFile_CreateTargetLight", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMFile_CreateTargetLight([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [Out, MarshalAs(UnmanagedType.U4)] out uint out_id); /// BMMeshTrans_New /// Type: BMap::BMMeshTransition*. This is OUT parameter. /// True if no error, otherwise False. @@ -1151,54 +1173,198 @@ namespace BMapSharp { [DllImport(g_DllName, EntryPoint = "BMMesh_SetMaterialSlot", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] internal static extern bool BMMesh_SetMaterialSlot([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.U4)] uint index, [In, MarshalAs(UnmanagedType.U4)] uint mtlid); - /// BM3dObject_GetWorldMatrix + /// BM3dEntity_GetWorldMatrix /// Type: BMap::BMFile*. The pointer to corresponding BMFile. /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. /// Type: LibCmo::VxMath::VxMatrix. This is OUT parameter. /// True if no error, otherwise False. - [DllImport(g_DllName, EntryPoint = "BM3dObject_GetWorldMatrix", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [DllImport(g_DllName, EntryPoint = "BM3dEntity_GetWorldMatrix", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool BM3dObject_GetWorldMatrix([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.Struct)] out VxMatrix out_mat); - /// BM3dObject_SetWorldMatrix + internal static extern bool BM3dEntity_GetWorldMatrix([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.Struct)] out VxMatrix out_mat); + /// BM3dEntity_SetWorldMatrix /// Type: BMap::BMFile*. The pointer to corresponding BMFile. /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. /// Type: LibCmo::VxMath::VxMatrix. /// True if no error, otherwise False. - [DllImport(g_DllName, EntryPoint = "BM3dObject_SetWorldMatrix", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [DllImport(g_DllName, EntryPoint = "BM3dEntity_SetWorldMatrix", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool BM3dObject_SetWorldMatrix([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.Struct)] VxMatrix mat); - /// BM3dObject_GetCurrentMesh + internal static extern bool BM3dEntity_SetWorldMatrix([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.Struct)] VxMatrix mat); + /// BM3dEntity_GetCurrentMesh /// Type: BMap::BMFile*. The pointer to corresponding BMFile. /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. /// Type: LibCmo::CK2::CK_ID. This is OUT parameter. /// True if no error, otherwise False. - [DllImport(g_DllName, EntryPoint = "BM3dObject_GetCurrentMesh", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [DllImport(g_DllName, EntryPoint = "BM3dEntity_GetCurrentMesh", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool BM3dObject_GetCurrentMesh([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.U4)] out uint out_meshid); - /// BM3dObject_SetCurrentMesh + internal static extern bool BM3dEntity_GetCurrentMesh([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.U4)] out uint out_meshid); + /// BM3dEntity_SetCurrentMesh /// Type: BMap::BMFile*. The pointer to corresponding BMFile. /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. /// Type: LibCmo::CK2::CK_ID. /// True if no error, otherwise False. - [DllImport(g_DllName, EntryPoint = "BM3dObject_SetCurrentMesh", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [DllImport(g_DllName, EntryPoint = "BM3dEntity_SetCurrentMesh", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool BM3dObject_SetCurrentMesh([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.U4)] uint meshid); - /// BM3dObject_GetVisibility + internal static extern bool BM3dEntity_SetCurrentMesh([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.U4)] uint meshid); + /// BM3dEntity_GetVisibility /// Type: BMap::BMFile*. The pointer to corresponding BMFile. /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. /// Type: bool. This is OUT parameter. /// True if no error, otherwise False. - [DllImport(g_DllName, EntryPoint = "BM3dObject_GetVisibility", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [DllImport(g_DllName, EntryPoint = "BM3dEntity_GetVisibility", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool BM3dObject_GetVisibility([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.U1)] out bool out_isVisible); - /// BM3dObject_SetVisibility + internal static extern bool BM3dEntity_GetVisibility([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.U1)] out bool out_isVisible); + /// BM3dEntity_SetVisibility /// Type: BMap::BMFile*. The pointer to corresponding BMFile. /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. /// Type: bool. /// True if no error, otherwise False. - [DllImport(g_DllName, EntryPoint = "BM3dObject_SetVisibility", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [DllImport(g_DllName, EntryPoint = "BM3dEntity_SetVisibility", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] [return: MarshalAs(UnmanagedType.U1)] - internal static extern bool BM3dObject_SetVisibility([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.U1)] bool is_visible); + internal static extern bool BM3dEntity_SetVisibility([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.U1)] bool is_visible); + /// BMLight_GetType + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::VxMath::VXLIGHT_TYPE. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetType", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetType([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.U4)] out VXLIGHT_TYPE out_val); + /// BMLight_SetType + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::VxMath::VXLIGHT_TYPE. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetType", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetType([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.U4)] VXLIGHT_TYPE val); + /// BMLight_GetColor + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::VxMath::VxColor. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetColor", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetColor([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.Struct)] out VxColor out_val); + /// BMLight_SetColor + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::VxMath::VxColor. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetColor", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetColor([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.Struct)] VxColor col); + /// BMLight_GetConstantAttenuation + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetConstantAttenuation", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetConstantAttenuation([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetConstantAttenuation + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetConstantAttenuation", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetConstantAttenuation([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); + /// BMLight_GetLinearAttenuation + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetLinearAttenuation", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetLinearAttenuation([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetLinearAttenuation + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetLinearAttenuation", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetLinearAttenuation([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); + /// BMLight_GetQuadraticAttenuation + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetQuadraticAttenuation", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetQuadraticAttenuation([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetQuadraticAttenuation + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetQuadraticAttenuation", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetQuadraticAttenuation([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); + /// BMLight_GetRange + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetRange", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetRange([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetRange + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetRange", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetRange([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); + /// BMLight_GetHotSpot + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetHotSpot", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetHotSpot([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetHotSpot + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetHotSpot", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetHotSpot([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); + /// BMLight_GetFalloff + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetFalloff", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetFalloff([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetFalloff + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetFalloff", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetFalloff([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); + /// BMLight_GetFalloffShape + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. This is OUT parameter. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_GetFalloffShape", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_GetFalloffShape([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [Out, MarshalAs(UnmanagedType.R4)] out float out_val); + /// BMLight_SetFalloffShape + /// Type: BMap::BMFile*. The pointer to corresponding BMFile. + /// Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. + /// Type: LibCmo::CKFLOAT. + /// True if no error, otherwise False. + [DllImport(g_DllName, EntryPoint = "BMLight_SetFalloffShape", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true)] + [return: MarshalAs(UnmanagedType.U1)] + internal static extern bool BMLight_SetFalloffShape([In, MarshalAs(UnmanagedType.SysInt)] IntPtr bmfile, [In, MarshalAs(UnmanagedType.U4)] uint objid, [In, MarshalAs(UnmanagedType.R4)] float val); // ##### GENERATED FUNCTIONS END ##### diff --git a/BMapBindings/BMapSharp/BMapSharp/BMapWrapper.cs b/BMapBindings/BMapSharp/BMapSharp/BMapWrapper.cs index a690b78..1536bbb 100644 --- a/BMapBindings/BMapSharp/BMapSharp/BMapWrapper.cs +++ b/BMapBindings/BMapSharp/BMapSharp/BMapWrapper.cs @@ -352,7 +352,7 @@ namespace BMapSharp.BMapWrapper { BMapException.ThrowIfFailed(BMap.BMMesh_GetFaceMaterialSlotIndexs(getPointer(), getCKID(), out IntPtr out_mem)); Utils.ShortAssigner(out_mem, GetFaceCount(), iem); } - + public uint GetMaterialSlotCount() => getGenericValue(BMap.BMMesh_GetMaterialSlotCount); public void SetMaterialSlotCount(uint count) => setGenericValue(BMap.BMMesh_SetMaterialSlotCount, count); public IEnumerable GetMaterialSlots() { @@ -375,24 +375,61 @@ namespace BMapSharp.BMapWrapper { } - public class BM3dObject : BMObject { - internal BM3dObject(IntPtr raw_pointer, uint ckid) : base(raw_pointer, ckid) { } + public class BM3dEntity : BMObject { + internal BM3dEntity(IntPtr raw_pointer, uint ckid) : base(raw_pointer, ckid) { } - public VxMatrix GetWorldMatrix() => getGenericValue(BMap.BM3dObject_GetWorldMatrix); - public void SetWorldMatrix(VxMatrix mat) => setGenericValue(BMap.BM3dObject_SetWorldMatrix, mat); + public VxMatrix GetWorldMatrix() => getGenericValue(BMap.BM3dEntity_GetWorldMatrix); + public void SetWorldMatrix(VxMatrix mat) => setGenericValue(BMap.BM3dEntity_SetWorldMatrix, mat); public BMMesh GetCurrentMesh() { - BMapException.ThrowIfFailed(BMap.BM3dObject_GetCurrentMesh(getPointer(), getCKID(), out uint out_meshid)); + BMapException.ThrowIfFailed(BMap.BM3dEntity_GetCurrentMesh(getPointer(), getCKID(), out uint out_meshid)); if (out_meshid == Utils.INVALID_CKID) return null; else return new BMMesh(getPointer(), out_meshid); } public void SetCurrentMesh(BMMesh mesh) { uint meshid = (mesh is null) ? Utils.INVALID_CKID : mesh.getCKID(); - BMapException.ThrowIfFailed(BMap.BM3dObject_SetCurrentMesh(getPointer(), getCKID(), meshid)); + BMapException.ThrowIfFailed(BMap.BM3dEntity_SetCurrentMesh(getPointer(), getCKID(), meshid)); } - public bool GetVisibility() => getGenericValue(BMap.BM3dObject_GetVisibility); - public void SetVisibility(bool visb) => setGenericValue(BMap.BM3dObject_SetVisibility, visb); + public bool GetVisibility() => getGenericValue(BMap.BM3dEntity_GetVisibility); + public void SetVisibility(bool visb) => setGenericValue(BMap.BM3dEntity_SetVisibility, visb); + } + + public class BM3dObject : BM3dEntity { + internal BM3dObject(IntPtr raw_pointer, uint ckid) : base(raw_pointer, ckid) { } + } + + public class BMLight : BM3dEntity { + internal BMLight(IntPtr raw_pointer, uint ckid) : base(raw_pointer, ckid) { } + + // Name `GetType` is conflict with C# base class function name. + // So we add a `Light` prefix for it. + public VXLIGHT_TYPE GetLightType() => getGenericValue(BMap.BMLight_GetType); + public void SetLightType(VXLIGHT_TYPE val) => setGenericValue(BMap.BMLight_SetType, val); + + public VxColor GetColor() => getGenericValue(BMap.BMLight_GetColor); + public void SetColor(VxColor col) => setGenericValue(BMap.BMLight_SetColor, col); + + public float GetConstantAttenuation() => getGenericValue(BMap.BMLight_GetConstantAttenuation); + public void SetConstantAttenuation(float val) => setGenericValue(BMap.BMLight_SetConstantAttenuation, val); + public float GetLinearAttenuation() => getGenericValue(BMap.BMLight_GetLinearAttenuation); + public void SetLinearAttenuation(float val) => setGenericValue(BMap.BMLight_SetLinearAttenuation, val); + public float GetQuadraticAttenuation() => getGenericValue(BMap.BMLight_GetQuadraticAttenuation); + public void SetQuadraticAttenuation(float val) => setGenericValue(BMap.BMLight_SetQuadraticAttenuation, val); + + public float GetRange() => getGenericValue(BMap.BMLight_GetRange); + public void SetRange(float val) => setGenericValue(BMap.BMLight_SetRange, val); + + public float GetHotSpot() => getGenericValue(BMap.BMLight_GetHotSpot); + public void SetHotSpot(float val) => setGenericValue(BMap.BMLight_SetHotSpot, val); + public float GetFalloff() => getGenericValue(BMap.BMLight_GetFalloff); + public void SetFalloff(float val) => setGenericValue(BMap.BMLight_SetFalloff, val); + public float GetFalloffShape() => getGenericValue(BMap.BMLight_GetFalloffShape); + public void SetFalloffShape(float val) => setGenericValue(BMap.BMLight_SetFalloffShape, val); + } + + public class BMTargetLight : BMLight { + internal BMTargetLight(IntPtr raw_pointer, uint ckid) : base(raw_pointer, ckid) { } } public class BMGroup : BMObject { @@ -463,6 +500,10 @@ namespace BMapSharp.BMapWrapper { getCKObjectCount(BMap.BMFile_GetGroupCount); public IEnumerable GetGroups() => getCKObjects(BMap.BMFile_GetGroupCount, BMap.BMFile_GetGroup, (bmf, id) => new BMGroup(bmf, id)); + public uint GetTargetLightCount() => + getCKObjectCount(BMap.BMFile_GetTargetLightCount); + public IEnumerable GetTargetLights() => + getCKObjects(BMap.BMFile_GetTargetLightCount, BMap.BMFile_GetTargetLight, (bmf, id) => new BMTargetLight(bmf, id)); } @@ -504,6 +545,7 @@ namespace BMapSharp.BMapWrapper { public BMMesh CreateMesh() => createCKObject(BMap.BMFile_CreateMesh, (bmf, id) => new BMMesh(bmf, id)); public BM3dObject Create3dObject() => createCKObject(BMap.BMFile_Create3dObject, (bmf, id) => new BM3dObject(bmf, id)); public BMGroup CreateGroup() => createCKObject(BMap.BMFile_CreateGroup, (bmf, id) => new BMGroup(bmf, id)); + public BMTargetLight CreateTargetLight() => createCKObject(BMap.BMFile_CreateTargetLight, (bmf, id) => new BMTargetLight(bmf, id)); } public sealed class BMMeshTrans : AbstractPointer { diff --git a/BMapBindings/BMapSharp/BMapSharp/VirtoolsTypes.cs b/BMapBindings/BMapSharp/BMapSharp/VirtoolsTypes.cs index 20ad55b..6d9e21b 100644 --- a/BMapBindings/BMapSharp/BMapSharp/VirtoolsTypes.cs +++ b/BMapBindings/BMapSharp/BMapSharp/VirtoolsTypes.cs @@ -226,6 +226,13 @@ namespace BMapSharp.VirtoolsTypes { _4_ARGB8888_CLUT = 31, /**< 4 bits indexed CLUT (ARGB) */ } + public enum VXLIGHT_TYPE : uint { + VX_LIGHTPOINT = 1, /**< The Light is a point of light */ + VX_LIGHTSPOT = 2, /**< The light is a spotlight */ + VX_LIGHTDIREC = 3, /**< The light is directional light : Lights comes from an infinite point so only direction of light can be given */ + // VX_LIGHTPARA = 4UL, /**< Obsolete, do not use */ + } + public enum VXTEXTURE_BLENDMODE : uint { VXTEXTUREBLEND_DECAL = 1, /**< Texture replace any material information */ VXTEXTUREBLEND_MODULATE = 2, /**< Texture and material are combine. Alpha information of the texture replace material alpha component. */ diff --git a/BMapBindings/BMapSharp/BMapSharpTestbench/Program.cs b/BMapBindings/BMapSharp/BMapSharpTestbench/Program.cs index 8c0ca73..a1daed6 100644 --- a/BMapBindings/BMapSharp/BMapSharpTestbench/Program.cs +++ b/BMapBindings/BMapSharp/BMapSharpTestbench/Program.cs @@ -21,7 +21,7 @@ namespace BMapSharpTestbench { Console.ReadKey(true); // Start testbench - string file_name = "Level_02.NMO"; + string file_name = "LightCameraTest.nmo"; string temp_folder = "Temp"; string texture_folder = "F:\\Ballance\\Ballance\\Textures"; string[] encodings = ["cp1252", "gb2312"]; @@ -66,38 +66,38 @@ namespace BMapSharpTestbench { // Console.WriteLine($"\tMaterial Slot Count: {mesh.GetMaterialSlotCount()}"); // } - Console.WriteLine("===== Materials ====="); - foreach (var mtl in reader.GetMaterials()) { - Console.WriteLine(mtl.GetName()); + // Console.WriteLine("===== Materials ====="); + // foreach (var mtl in reader.GetMaterials()) { + // Console.WriteLine(mtl.GetName()); - Console.WriteLine($"\tDiffuse: {mtl.GetDiffuse().ToManagedRGBA()}"); - Console.WriteLine($"\tAmbient: {mtl.GetAmbient().ToManagedRGBA()}"); - Console.WriteLine($"\tSpecular: {mtl.GetSpecular().ToManagedRGBA()}"); - Console.WriteLine($"\tEmissive: {mtl.GetEmissive().ToManagedRGBA()}"); + // Console.WriteLine($"\tDiffuse: {mtl.GetDiffuse().ToManagedRGBA()}"); + // Console.WriteLine($"\tAmbient: {mtl.GetAmbient().ToManagedRGBA()}"); + // Console.WriteLine($"\tSpecular: {mtl.GetSpecular().ToManagedRGBA()}"); + // Console.WriteLine($"\tEmissive: {mtl.GetEmissive().ToManagedRGBA()}"); - Console.WriteLine($"\tSpecular Power: {mtl.GetSpecularPower()}"); + // Console.WriteLine($"\tSpecular Power: {mtl.GetSpecularPower()}"); - Console.WriteLine($"\tTexture Border Color: {mtl.GetTextureBorderColor().ToManagedRGBA()}"); + // Console.WriteLine($"\tTexture Border Color: {mtl.GetTextureBorderColor().ToManagedRGBA()}"); - Console.WriteLine($"\tTexture Blend Mode: {mtl.GetTextureBlendMode()}"); - Console.WriteLine($"\tTexture Min Mode: {mtl.GetTextureMinMode()}"); - Console.WriteLine($"\tTexture Mag Mode: {mtl.GetTextureMagMode()}"); - Console.WriteLine($"\tSource Blend: {mtl.GetSourceBlend()}"); - Console.WriteLine($"\tDest Blend: {mtl.GetDestBlend()}"); - Console.WriteLine($"\tFill Mode: {mtl.GetFillMode()}"); - Console.WriteLine($"\tShade Mode: {mtl.GetShadeMode()}"); + // Console.WriteLine($"\tTexture Blend Mode: {mtl.GetTextureBlendMode()}"); + // Console.WriteLine($"\tTexture Min Mode: {mtl.GetTextureMinMode()}"); + // Console.WriteLine($"\tTexture Mag Mode: {mtl.GetTextureMagMode()}"); + // Console.WriteLine($"\tSource Blend: {mtl.GetSourceBlend()}"); + // Console.WriteLine($"\tDest Blend: {mtl.GetDestBlend()}"); + // Console.WriteLine($"\tFill Mode: {mtl.GetFillMode()}"); + // Console.WriteLine($"\tShade Mode: {mtl.GetShadeMode()}"); - Console.WriteLine($"\tAlpha Test Enabled: {mtl.GetAlphaTestEnabled()}"); - Console.WriteLine($"\tAlpha Blend Enabled: {mtl.GetAlphaBlendEnabled()}"); - Console.WriteLine($"\tPerspective Correction Enabled: {mtl.GetPerspectiveCorrectionEnabled()}"); - Console.WriteLine($"\tZ Write Enabled: {mtl.GetZWriteEnabled()}"); - Console.WriteLine($"\tTwo Sided Enabled: {mtl.GetTwoSidedEnabled()}"); + // Console.WriteLine($"\tAlpha Test Enabled: {mtl.GetAlphaTestEnabled()}"); + // Console.WriteLine($"\tAlpha Blend Enabled: {mtl.GetAlphaBlendEnabled()}"); + // Console.WriteLine($"\tPerspective Correction Enabled: {mtl.GetPerspectiveCorrectionEnabled()}"); + // Console.WriteLine($"\tZ Write Enabled: {mtl.GetZWriteEnabled()}"); + // Console.WriteLine($"\tTwo Sided Enabled: {mtl.GetTwoSidedEnabled()}"); - Console.WriteLine($"\tAlpha Ref: {mtl.GetAlphaRef()}"); + // Console.WriteLine($"\tAlpha Ref: {mtl.GetAlphaRef()}"); - Console.WriteLine($"\tAlpha Func: {mtl.GetAlphaFunc()}"); - Console.WriteLine($"\tZ Func: {mtl.GetZFunc()}"); - } + // Console.WriteLine($"\tAlpha Func: {mtl.GetAlphaFunc()}"); + // Console.WriteLine($"\tZ Func: {mtl.GetZFunc()}"); + // } // Console.WriteLine("===== Textures ====="); // foreach (var tex in reader.GetTextures()) { @@ -108,6 +108,24 @@ namespace BMapSharpTestbench { // Console.WriteLine($"\tVideo Format: {tex.GetVideoFormat()}"); // } + Console.WriteLine("===== Target Lights ====="); + foreach (var lit in reader.GetTargetLights()) { + Console.WriteLine(lit.GetName()); + + Console.WriteLine($"\tVisibility: {lit.GetVisibility()}"); + Console.WriteLine($"\tMatrix: {lit.GetWorldMatrix().ToManaged()}"); + + Console.WriteLine($"Type: {lit.GetLightType()}"); + Console.WriteLine($"Color: {lit.GetColor().ToManagedRGBA()}"); + Console.WriteLine($"Constant Attenuation: {lit.GetConstantAttenuation()}"); + Console.WriteLine($"Linear Attenuation: {lit.GetLinearAttenuation()}"); + Console.WriteLine($"Quadratic Attenuation: {lit.GetQuadraticAttenuation()}"); + Console.WriteLine($"Range: {lit.GetRange()}"); + Console.WriteLine($"Hot Spot: {lit.GetHotSpot()}"); + Console.WriteLine($"Falloff: {lit.GetFalloff()}"); + Console.WriteLine($"Falloff Shape: {lit.GetFalloffShape()}"); + } + Console.WriteLine("===== END ====="); } diff --git a/BMapBindings/PyBMap/PyBMap/bmap.py b/BMapBindings/PyBMap/PyBMap/bmap.py index 8d79def..f0a7fb0 100644 --- a/BMapBindings/PyBMap/PyBMap/bmap.py +++ b/BMapBindings/PyBMap/PyBMap/bmap.py @@ -227,6 +227,22 @@ BMFile_GetTexture = _create_bmap_func('BMFile_GetTexture', [bm_void_p, bm_CKDWOR # @param out_id[out] Type: LibCmo::CK2::CK_ID. Use ctypes.byref(data) pass it. # @return True if no error, otherwise False. BMFile_CreateTexture = _create_bmap_func('BMFile_CreateTexture', [bm_void_p, bm_CKID_p]) +## BMFile_GetTargetLightCount +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param out_count[out] Type: LibCmo::CKDWORD. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMFile_GetTargetLightCount = _create_bmap_func('BMFile_GetTargetLightCount', [bm_void_p, bm_CKDWORD_p]) +## BMFile_GetTargetLight +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param idx[in] Type: LibCmo::CKDWORD. +# @param out_id[out] Type: LibCmo::CK2::CK_ID. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMFile_GetTargetLight = _create_bmap_func('BMFile_GetTargetLight', [bm_void_p, bm_CKDWORD, bm_CKID_p]) +## BMFile_CreateTargetLight +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param out_id[out] Type: LibCmo::CK2::CK_ID. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMFile_CreateTargetLight = _create_bmap_func('BMFile_CreateTargetLight', [bm_void_p, bm_CKID_p]) ## BMMeshTrans_New # @param out_trans[out] Type: BMap::BMMeshTransition*. Use ctypes.byref(data) pass it. # @return True if no error, otherwise False. @@ -747,42 +763,150 @@ BMMesh_GetMaterialSlot = _create_bmap_func('BMMesh_GetMaterialSlot', [bm_void_p, # @param mtlid[in] Type: LibCmo::CK2::CK_ID. # @return True if no error, otherwise False. BMMesh_SetMaterialSlot = _create_bmap_func('BMMesh_SetMaterialSlot', [bm_void_p, bm_CKID, bm_CKDWORD, bm_CKID]) -## BM3dObject_GetWorldMatrix +## BM3dEntity_GetWorldMatrix # @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. # @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. # @param out_mat[out] Type: LibCmo::VxMath::VxMatrix. Use ctypes.byref(data) pass it. # @return True if no error, otherwise False. -BM3dObject_GetWorldMatrix = _create_bmap_func('BM3dObject_GetWorldMatrix', [bm_void_p, bm_CKID, bm_VxMatrix_p]) -## BM3dObject_SetWorldMatrix +BM3dEntity_GetWorldMatrix = _create_bmap_func('BM3dEntity_GetWorldMatrix', [bm_void_p, bm_CKID, bm_VxMatrix_p]) +## BM3dEntity_SetWorldMatrix # @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. # @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. # @param mat[in] Type: LibCmo::VxMath::VxMatrix. # @return True if no error, otherwise False. -BM3dObject_SetWorldMatrix = _create_bmap_func('BM3dObject_SetWorldMatrix', [bm_void_p, bm_CKID, bm_VxMatrix]) -## BM3dObject_GetCurrentMesh +BM3dEntity_SetWorldMatrix = _create_bmap_func('BM3dEntity_SetWorldMatrix', [bm_void_p, bm_CKID, bm_VxMatrix]) +## BM3dEntity_GetCurrentMesh # @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. # @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. # @param out_meshid[out] Type: LibCmo::CK2::CK_ID. Use ctypes.byref(data) pass it. # @return True if no error, otherwise False. -BM3dObject_GetCurrentMesh = _create_bmap_func('BM3dObject_GetCurrentMesh', [bm_void_p, bm_CKID, bm_CKID_p]) -## BM3dObject_SetCurrentMesh +BM3dEntity_GetCurrentMesh = _create_bmap_func('BM3dEntity_GetCurrentMesh', [bm_void_p, bm_CKID, bm_CKID_p]) +## BM3dEntity_SetCurrentMesh # @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. # @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. # @param meshid[in] Type: LibCmo::CK2::CK_ID. # @return True if no error, otherwise False. -BM3dObject_SetCurrentMesh = _create_bmap_func('BM3dObject_SetCurrentMesh', [bm_void_p, bm_CKID, bm_CKID]) -## BM3dObject_GetVisibility +BM3dEntity_SetCurrentMesh = _create_bmap_func('BM3dEntity_SetCurrentMesh', [bm_void_p, bm_CKID, bm_CKID]) +## BM3dEntity_GetVisibility # @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. # @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. # @param out_isVisible[out] Type: bool. Use ctypes.byref(data) pass it. # @return True if no error, otherwise False. -BM3dObject_GetVisibility = _create_bmap_func('BM3dObject_GetVisibility', [bm_void_p, bm_CKID, bm_bool_p]) -## BM3dObject_SetVisibility +BM3dEntity_GetVisibility = _create_bmap_func('BM3dEntity_GetVisibility', [bm_void_p, bm_CKID, bm_bool_p]) +## BM3dEntity_SetVisibility # @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. # @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. # @param is_visible[in] Type: bool. # @return True if no error, otherwise False. -BM3dObject_SetVisibility = _create_bmap_func('BM3dObject_SetVisibility', [bm_void_p, bm_CKID, bm_bool]) +BM3dEntity_SetVisibility = _create_bmap_func('BM3dEntity_SetVisibility', [bm_void_p, bm_CKID, bm_bool]) +## BMLight_GetType +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::VxMath::VXLIGHT_TYPE. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetType = _create_bmap_func('BMLight_GetType', [bm_void_p, bm_CKID, bm_enum_p]) +## BMLight_SetType +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::VxMath::VXLIGHT_TYPE. +# @return True if no error, otherwise False. +BMLight_SetType = _create_bmap_func('BMLight_SetType', [bm_void_p, bm_CKID, bm_enum]) +## BMLight_GetColor +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::VxMath::VxColor. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetColor = _create_bmap_func('BMLight_GetColor', [bm_void_p, bm_CKID, bm_VxColor_p]) +## BMLight_SetColor +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param col[in] Type: LibCmo::VxMath::VxColor. +# @return True if no error, otherwise False. +BMLight_SetColor = _create_bmap_func('BMLight_SetColor', [bm_void_p, bm_CKID, bm_VxColor]) +## BMLight_GetConstantAttenuation +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetConstantAttenuation = _create_bmap_func('BMLight_GetConstantAttenuation', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetConstantAttenuation +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetConstantAttenuation = _create_bmap_func('BMLight_SetConstantAttenuation', [bm_void_p, bm_CKID, bm_CKFLOAT]) +## BMLight_GetLinearAttenuation +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetLinearAttenuation = _create_bmap_func('BMLight_GetLinearAttenuation', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetLinearAttenuation +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetLinearAttenuation = _create_bmap_func('BMLight_SetLinearAttenuation', [bm_void_p, bm_CKID, bm_CKFLOAT]) +## BMLight_GetQuadraticAttenuation +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetQuadraticAttenuation = _create_bmap_func('BMLight_GetQuadraticAttenuation', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetQuadraticAttenuation +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetQuadraticAttenuation = _create_bmap_func('BMLight_SetQuadraticAttenuation', [bm_void_p, bm_CKID, bm_CKFLOAT]) +## BMLight_GetRange +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetRange = _create_bmap_func('BMLight_GetRange', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetRange +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetRange = _create_bmap_func('BMLight_SetRange', [bm_void_p, bm_CKID, bm_CKFLOAT]) +## BMLight_GetHotSpot +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetHotSpot = _create_bmap_func('BMLight_GetHotSpot', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetHotSpot +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetHotSpot = _create_bmap_func('BMLight_SetHotSpot', [bm_void_p, bm_CKID, bm_CKFLOAT]) +## BMLight_GetFalloff +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetFalloff = _create_bmap_func('BMLight_GetFalloff', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetFalloff +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetFalloff = _create_bmap_func('BMLight_SetFalloff', [bm_void_p, bm_CKID, bm_CKFLOAT]) +## BMLight_GetFalloffShape +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param out_val[out] Type: LibCmo::CKFLOAT. Use ctypes.byref(data) pass it. +# @return True if no error, otherwise False. +BMLight_GetFalloffShape = _create_bmap_func('BMLight_GetFalloffShape', [bm_void_p, bm_CKID, bm_CKFLOAT_p]) +## BMLight_SetFalloffShape +# @param bmfile[in] Type: BMap::BMFile*. The pointer to corresponding BMFile. +# @param objid[in] Type: LibCmo::CK2::CK_ID. The CKID of object you accessing. +# @param val[in] Type: LibCmo::CKFLOAT. +# @return True if no error, otherwise False. +BMLight_SetFalloffShape = _create_bmap_func('BMLight_SetFalloffShape', [bm_void_p, bm_CKID, bm_CKFLOAT]) ##### GENERATED FUNCTIONS END ##### diff --git a/BMapBindings/PyBMap/PyBMap/bmap_wrapper.py b/BMapBindings/PyBMap/PyBMap/bmap_wrapper.py index 4eef6d0..f3880b1 100644 --- a/BMapBindings/PyBMap/PyBMap/bmap_wrapper.py +++ b/BMapBindings/PyBMap/PyBMap/bmap_wrapper.py @@ -476,10 +476,10 @@ class BMMesh(BMObject): except StopIteration: _Utils.raise_out_of_length_exception() -class BM3dObject(BMObject): +class BM3dEntity(BMObject): def get_world_matrix(self) -> virtools_types.VxMatrix: mat: bmap.bm_VxMatrix = bmap.bm_VxMatrix() - bmap.BM3dObject_GetWorldMatrix(self._get_pointer(), self._get_ckid(), ctypes.byref(mat)) + bmap.BM3dEntity_GetWorldMatrix(self._get_pointer(), self._get_ckid(), ctypes.byref(mat)) # use cast & pointer to get matrix data conveniently flat: bmap.bm_CKFLOAT_p = ctypes.cast(ctypes.byref(mat), bmap.bm_CKFLOAT_p) ret: virtools_types.VxMatrix = virtools_types.VxMatrix() @@ -489,11 +489,11 @@ class BM3dObject(BMObject): def set_world_matrix(self, mat_: virtools_types.VxMatrix) -> None: # star syntax expand the tuple as the argument. mat: bmap.bm_VxMatrix = bmap.bm_VxMatrix(*(mat_.to_const())) - bmap.BM3dObject_SetWorldMatrix(self._get_pointer(), self._get_ckid(), mat) + bmap.BM3dEntity_SetWorldMatrix(self._get_pointer(), self._get_ckid(), mat) def get_current_mesh(self) -> BMMesh | None: ckid: bmap.bm_CKID = bmap.bm_CKID() - bmap.BM3dObject_GetCurrentMesh(self._get_pointer(), self._get_ckid(), ctypes.byref(ckid)) + bmap.BM3dEntity_GetCurrentMesh(self._get_pointer(), self._get_ckid(), ctypes.byref(ckid)) if ckid.value == g_InvalidCKID: return None else: @@ -503,12 +503,60 @@ class BM3dObject(BMObject): ckid: bmap.bm_CKID = bmap.bm_CKID(g_InvalidCKID) if mesh is not None: ckid = mesh._get_ckid() - bmap.BM3dObject_SetCurrentMesh(self._get_pointer(), self._get_ckid(), ckid) + bmap.BM3dEntity_SetCurrentMesh(self._get_pointer(), self._get_ckid(), ckid) def get_visibility(self) -> bool: - return self._get_bool_value(bmap.BM3dObject_GetVisibility) + return self._get_bool_value(bmap.BM3dEntity_GetVisibility) def set_visibility(self, visb_: bool) -> None: - self._set_bool_value(bmap.BM3dObject_SetVisibility, visb_) + self._set_bool_value(bmap.BM3dEntity_SetVisibility, visb_) + +class BM3dObject(BM3dEntity): + pass + +class BMLight(BM3dEntity): + def get_type(self) -> virtools_types.VXLIGHT_TYPE: + return self._get_enum_value(virtools_types.VXLIGHT_TYPE, bmap.BMLight_GetType) + def set_type(self, data_: virtools_types.VXLIGHT_TYPE) -> None: + self._set_enum_value(bmap.BMLight_SetType, data_) + + def get_color(self) -> virtools_types.VxColor: + return self._get_vxcolor_value(bmap.BMLight_GetColor) + def set_color(self, col: virtools_types.VxColor) -> None: + self._set_vxcolor_value(bmap.BMLight_SetColor, col) + + def get_constant_attenuation(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetConstantAttenuation) + def set_constant_attenuation(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetConstantAttenuation, val_) + def get_linear_attenuation(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetLinearAttenuation) + def set_linear_attenuation(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetLinearAttenuation, val_) + def get_quadratic_attenuation(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetQuadraticAttenuation) + def set_quadratic_attenuation(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetQuadraticAttenuation, val_) + + def get_range(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetRange) + def set_range(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetRange, val_) + + def get_hot_spot(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetHotSpot) + def set_hot_spot(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetHotSpot, val_) + def get_falloff(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetFalloff) + def set_falloff(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetFalloff, val_) + def get_falloff_shape(self) -> float: + return self._get_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_GetFalloffShape) + def set_falloff_shape(self, val_: float) -> None: + self._set_float_point_value(bmap.bm_CKFLOAT, bmap.BMLight_SetFalloffShape, val_) + +class BMTargetLight(BMLight): + pass class BMGroup(BMObject): def add_object(self, member: BM3dObject) -> None: @@ -603,6 +651,10 @@ class BMFileReader(_AbstractPointer): return self.__get_ckobject_count(bmap.BMFile_GetGroupCount) def get_groups(self) -> typing.Iterator[BMGroup]: return self.__get_ckobjects(BMGroup, bmap.BMFile_GetGroupCount, bmap.BMFile_GetGroup) + def get_target_light_count(self) -> int: + return self.__get_ckobject_count(bmap.BMFile_GetTargetLightCount) + def get_target_lights(self) -> typing.Iterator[BMTargetLight]: + return self.__get_ckobjects(BMTargetLight, bmap.BMFile_GetTargetLightCount, bmap.BMFile_GetTargetLight) class BMFileWriter(_AbstractPointer): def __init__(self, temp_folder_: str, texture_folder_: str, encodings_: tuple[str]): @@ -663,6 +715,8 @@ class BMFileWriter(_AbstractPointer): return self.__create_ckobject(BM3dObject, bmap.BMFile_Create3dObject) def create_group(self) -> BMGroup: return self.__create_ckobject(BMGroup, bmap.BMFile_CreateGroup) + def create_target_light(self) -> BMTargetLight: + return self.__create_ckobject(BMTargetLight, bmap.BMFile_CreateTargetLight) class BMMeshTrans(_AbstractPointer): def __init__(self): diff --git a/BMapBindings/PyBMap/PyBMap/virtools_types.py b/BMapBindings/PyBMap/PyBMap/virtools_types.py index c1e952d..24113b0 100644 --- a/BMapBindings/PyBMap/PyBMap/virtools_types.py +++ b/BMapBindings/PyBMap/PyBMap/virtools_types.py @@ -221,6 +221,15 @@ class VX_PIXELFORMAT(enum.IntEnum): _4_ABGR8888_CLUT = 30 ##< 4 bits indexed CLUT (ABGR) _4_ARGB8888_CLUT = 31 ##< 4 bits indexed CLUT (ARGB) +class VXLIGHT_TYPE(enum.IntEnum): + """! + Light type + """ + VX_LIGHTPOINT = 1 ##< The Light is a point of light + VX_LIGHTSPOT = 2 ##< The light is a spotlight + VX_LIGHTDIREC = 3 ##< The light is directional light : Lights comes from an infinite point so only direction of light can be given + #VX_LIGHTPARA = 4 ##< Obsolete, do not use + class VXTEXTURE_BLENDMODE(enum.IntEnum): """! Blend Mode Flags diff --git a/BMapBindings/PyBMap/testbench.py b/BMapBindings/PyBMap/testbench.py index 41e5959..b584afc 100644 --- a/BMapBindings/PyBMap/testbench.py +++ b/BMapBindings/PyBMap/testbench.py @@ -4,7 +4,7 @@ import PyBMap.bmap_wrapper as bmap def main() -> None: input(f'Python PID is {os.getpid()}. Waiting for debugger, press any key to continue...') - file_name: str = 'Level_02.NMO' + file_name: str = 'LightCameraTest.nmo' temp_folder: str = 'Temp' texture_folder: str = 'F:\\Ballance\\Ballance\\Textures' encodings: tuple[str, ...] = ('cp1252', ) @@ -38,37 +38,37 @@ def test_common(reader: bmap.BMFileReader): # print(f'\tFace Count: {mesh.get_face_count()}') # print(f'\tMaterial Slot Count: {mesh.get_material_slot_count()}') - print('===== Materials =====') - for mtl in reader.get_materials(): - print(mtl.get_name()) + # print('===== Materials =====') + # for mtl in reader.get_materials(): + # print(mtl.get_name()) - print(f'\tDiffuse: {mtl.get_diffuse().to_const_rgba()}') - print(f'\tAmbient: {mtl.get_ambient().to_const_rgba()}') - print(f'\tSpecular: {mtl.get_specular().to_const_rgba()}') - print(f'\tEmissive: {mtl.get_emissive().to_const_rgba()}') + # print(f'\tDiffuse: {mtl.get_diffuse().to_const_rgba()}') + # print(f'\tAmbient: {mtl.get_ambient().to_const_rgba()}') + # print(f'\tSpecular: {mtl.get_specular().to_const_rgba()}') + # print(f'\tEmissive: {mtl.get_emissive().to_const_rgba()}') - print(f'\tSpecular Power: {mtl.get_specular_power()}') + # print(f'\tSpecular Power: {mtl.get_specular_power()}') - print(f'\tTexture Border Color: {mtl.get_texture_border_color().to_const_rgba()}') + # print(f'\tTexture Border Color: {mtl.get_texture_border_color().to_const_rgba()}') - print(f'\tTexture Blend Mode: {mtl.get_texture_blend_mode()}') - print(f'\tTexture Min Mode: {mtl.get_texture_min_mode()}') - print(f'\tTexture Mag Mode: {mtl.get_texture_mag_mode()}') - print(f'\tSource Blend: {mtl.get_source_blend()}') - print(f'\tDest Blend: {mtl.get_dest_blend()}') - print(f'\tFill Mode: {mtl.get_fill_mode()}') - print(f'\tShade Mode: {mtl.get_shade_mode()}') + # print(f'\tTexture Blend Mode: {mtl.get_texture_blend_mode()}') + # print(f'\tTexture Min Mode: {mtl.get_texture_min_mode()}') + # print(f'\tTexture Mag Mode: {mtl.get_texture_mag_mode()}') + # print(f'\tSource Blend: {mtl.get_source_blend()}') + # print(f'\tDest Blend: {mtl.get_dest_blend()}') + # print(f'\tFill Mode: {mtl.get_fill_mode()}') + # print(f'\tShade Mode: {mtl.get_shade_mode()}') - print(f'\tAlpha Test Enabled: {mtl.get_alpha_test_enabled()}') - print(f'\tAlpha Blend Enabled: {mtl.get_alpha_blend_enabled()}') - print(f'\tPerspective Correction Enabled: {mtl.get_perspective_correction_enabled()}') - print(f'\tZ Write Enabled: {mtl.get_z_write_enabled()}') - print(f'\tTwo Sided Enabled: {mtl.get_two_sided_enabled()}') + # print(f'\tAlpha Test Enabled: {mtl.get_alpha_test_enabled()}') + # print(f'\tAlpha Blend Enabled: {mtl.get_alpha_blend_enabled()}') + # print(f'\tPerspective Correction Enabled: {mtl.get_perspective_correction_enabled()}') + # print(f'\tZ Write Enabled: {mtl.get_z_write_enabled()}') + # print(f'\tTwo Sided Enabled: {mtl.get_two_sided_enabled()}') - print(f'\tAlpha Ref: {mtl.get_alpha_ref()}') + # print(f'\tAlpha Ref: {mtl.get_alpha_ref()}') - print(f'\tAlpha Func: {mtl.get_alpha_func()}') - print(f'\tZ Func: {mtl.get_z_func()}') + # print(f'\tAlpha Func: {mtl.get_alpha_func()}') + # print(f'\tZ Func: {mtl.get_z_func()}') # print('===== Textures =====') # for tex in reader.get_textures(): @@ -78,6 +78,23 @@ def test_common(reader: bmap.BMFileReader): # print(f'\tSave Options: {tex.get_save_options()}') # print(f'\tVideo Format: {tex.get_video_format()}') + print('===== Target Lights =====') + for lit in reader.get_target_lights(): + print(lit.get_name()) + + print(f'\tVisibility: {lit.get_visibility()}') + print(f'\tMatrix: {lit.get_world_matrix().to_const()}') + + print(f'\tType: {lit.get_type()}') + print(f'\tColor: {lit.get_color().to_const_rgba()}') + print(f'\tConstant Attenuation: {lit.get_constant_attenuation()}') + print(f'\tLinear Attenuation: {lit.get_linear_attenuation()}') + print(f'\tQuadratic Attenuation: {lit.get_quadratic_attenuation()}') + print(f'\tRange: {lit.get_range()}') + print(f'\tHot Spot: {lit.get_hot_spot()}') + print(f'\tFalloff: {lit.get_falloff()}') + print(f'\tFalloff Shape: {lit.get_falloff_shape()}') + print('===== END =====') def test_equatable(reader: bmap.BMFileReader): diff --git a/CodeGen/BMapBindings/CSharpWriter.java b/CodeGen/BMapBindings/CSharpWriter.java index 5c4fee3..8a1e138 100644 --- a/CodeGen/BMapBindings/CSharpWriter.java +++ b/CodeGen/BMapBindings/CSharpWriter.java @@ -188,6 +188,7 @@ public class CSharpWriter { break; case "CK_TEXTURE_SAVEOPTIONS": case "VX_PIXELFORMAT": + case "VXLIGHT_TYPE": case "VXTEXTURE_BLENDMODE": case "VXTEXTURE_FILTERMODE": case "VXTEXTURE_ADDRESSMODE": diff --git a/CodeGen/BMapBindings/PythonWriter.java b/CodeGen/BMapBindings/PythonWriter.java index 2a8f782..fd297b7 100644 --- a/CodeGen/BMapBindings/PythonWriter.java +++ b/CodeGen/BMapBindings/PythonWriter.java @@ -28,6 +28,7 @@ public class PythonWriter { cache.put("VxMatrix", "VxMatrix"); cache.put("CK_TEXTURE_SAVEOPTIONS", "enum"); cache.put("VX_PIXELFORMAT", "enum"); + cache.put("VXLIGHT_TYPE", "enum"); cache.put("VXTEXTURE_BLENDMODE", "enum"); cache.put("VXTEXTURE_FILTERMODE", "enum"); cache.put("VXTEXTURE_ADDRESSMODE", "enum");