feat(scripting): add mesh component script wrappers

This commit is contained in:
2026-03-27 14:52:00 +08:00
parent 2b0df52446
commit bea849646f
12 changed files with 448 additions and 8 deletions

View File

@@ -50,13 +50,15 @@ foreach(XCENGINE_REQUIRED_PATH
endforeach()
set(XCENGINE_SCRIPT_CORE_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Camera.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Behaviour.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Camera.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Component.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Debug.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/GameObject.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/InternalCalls.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Light.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MeshFilter.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MeshRenderer.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/MonoBehaviour.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Quaternion.cs
${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Space.cs
@@ -71,6 +73,7 @@ set(XCENGINE_GAME_SCRIPT_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/BuiltinComponentProbe.cs
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/HierarchyProbe.cs
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/LifecycleProbe.cs
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/MeshComponentProbe.cs
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformConversionProbe.cs
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformMotionProbe.cs
${CMAKE_CURRENT_SOURCE_DIR}/GameScripts/TransformOrientationProbe.cs

View File

@@ -0,0 +1,60 @@
using XCEngine;
namespace Gameplay
{
public sealed class MeshComponentProbe : MonoBehaviour
{
public bool HasMeshFilter;
public bool HasMeshRenderer;
public bool MeshFilterLookupSucceeded;
public bool MeshRendererLookupSucceeded;
public string ObservedInitialMeshPath = string.Empty;
public string ObservedUpdatedMeshPath = string.Empty;
public int ObservedInitialMaterialCount;
public string ObservedInitialMaterial0Path = string.Empty;
public bool ObservedInitialCastShadows;
public bool ObservedInitialReceiveShadows;
public int ObservedInitialRenderLayer;
public int ObservedUpdatedMaterialCount;
public string ObservedUpdatedMaterial1Path = string.Empty;
public bool ObservedUpdatedCastShadows;
public bool ObservedUpdatedReceiveShadows;
public int ObservedUpdatedRenderLayer;
public void Start()
{
HasMeshFilter = HasComponent<MeshFilter>();
HasMeshRenderer = HasComponent<MeshRenderer>();
MeshFilterLookupSucceeded = TryGetComponent(out MeshFilter meshFilter);
MeshRendererLookupSucceeded = TryGetComponent(out MeshRenderer meshRenderer);
if (meshFilter != null)
{
ObservedInitialMeshPath = meshFilter.meshPath;
meshFilter.meshPath = "Meshes/runtime_override.mesh";
ObservedUpdatedMeshPath = meshFilter.meshPath;
}
if (meshRenderer != null)
{
ObservedInitialMaterialCount = meshRenderer.materialCount;
ObservedInitialMaterial0Path = meshRenderer.GetMaterialPath(0);
ObservedInitialCastShadows = meshRenderer.castShadows;
ObservedInitialReceiveShadows = meshRenderer.receiveShadows;
ObservedInitialRenderLayer = meshRenderer.renderLayer;
meshRenderer.SetMaterialPath(1, "Materials/runtime_override.mat");
meshRenderer.castShadows = false;
meshRenderer.receiveShadows = true;
meshRenderer.renderLayer = 11;
ObservedUpdatedMaterialCount = meshRenderer.materialCount;
ObservedUpdatedMaterial1Path = meshRenderer.GetMaterialPath(1);
ObservedUpdatedCastShadows = meshRenderer.castShadows;
ObservedUpdatedReceiveShadows = meshRenderer.receiveShadows;
ObservedUpdatedRenderLayer = meshRenderer.renderLayer;
}
}
}
}

View File

@@ -187,5 +187,41 @@ namespace XCEngine
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void Light_SetCastsShadows(ulong gameObjectUUID, bool value);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern string MeshFilter_GetMeshPath(ulong gameObjectUUID);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void MeshFilter_SetMeshPath(ulong gameObjectUUID, string path);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int MeshRenderer_GetMaterialCount(ulong gameObjectUUID);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern string MeshRenderer_GetMaterialPath(ulong gameObjectUUID, int index);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void MeshRenderer_SetMaterialPath(ulong gameObjectUUID, int index, string path);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void MeshRenderer_ClearMaterials(ulong gameObjectUUID);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool MeshRenderer_GetCastShadows(ulong gameObjectUUID);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void MeshRenderer_SetCastShadows(ulong gameObjectUUID, bool value);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool MeshRenderer_GetReceiveShadows(ulong gameObjectUUID);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void MeshRenderer_SetReceiveShadows(ulong gameObjectUUID, bool value);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int MeshRenderer_GetRenderLayer(ulong gameObjectUUID);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void MeshRenderer_SetRenderLayer(ulong gameObjectUUID, int value);
}
}

View File

@@ -0,0 +1,22 @@
namespace XCEngine
{
public sealed class MeshFilter : Component
{
internal MeshFilter(ulong gameObjectUUID)
: base(gameObjectUUID)
{
}
public string MeshPath
{
get => InternalCalls.MeshFilter_GetMeshPath(GameObjectUUID) ?? string.Empty;
set => InternalCalls.MeshFilter_SetMeshPath(GameObjectUUID, value ?? string.Empty);
}
public string meshPath
{
get => MeshPath;
set => MeshPath = value;
}
}
}

View File

@@ -0,0 +1,64 @@
namespace XCEngine
{
public sealed class MeshRenderer : Component
{
internal MeshRenderer(ulong gameObjectUUID)
: base(gameObjectUUID)
{
}
public int MaterialCount => InternalCalls.MeshRenderer_GetMaterialCount(GameObjectUUID);
public int materialCount => MaterialCount;
public bool CastShadows
{
get => InternalCalls.MeshRenderer_GetCastShadows(GameObjectUUID);
set => InternalCalls.MeshRenderer_SetCastShadows(GameObjectUUID, value);
}
public bool castShadows
{
get => CastShadows;
set => CastShadows = value;
}
public bool ReceiveShadows
{
get => InternalCalls.MeshRenderer_GetReceiveShadows(GameObjectUUID);
set => InternalCalls.MeshRenderer_SetReceiveShadows(GameObjectUUID, value);
}
public bool receiveShadows
{
get => ReceiveShadows;
set => ReceiveShadows = value;
}
public int RenderLayer
{
get => InternalCalls.MeshRenderer_GetRenderLayer(GameObjectUUID);
set => InternalCalls.MeshRenderer_SetRenderLayer(GameObjectUUID, value);
}
public int renderLayer
{
get => RenderLayer;
set => RenderLayer = value;
}
public string GetMaterialPath(int index)
{
return InternalCalls.MeshRenderer_GetMaterialPath(GameObjectUUID, index) ?? string.Empty;
}
public void SetMaterialPath(int index, string path)
{
InternalCalls.MeshRenderer_SetMaterialPath(GameObjectUUID, index, path ?? string.Empty);
}
public void ClearMaterials()
{
InternalCalls.MeshRenderer_ClearMaterials(GameObjectUUID);
}
}
}