From 6ef7c5f00570347ac432ef4189a88aaa5f31f958 Mon Sep 17 00:00:00 2001 From: CortexCore <2630229280@qq.com> Date: Mon, 11 Mar 2024 02:16:25 +0800 Subject: [PATCH] 1 --- Assets/Artists/Arts/Logos/logo_CN_Intelli.png | Bin 0 -> 10980 bytes ...ersal Render Pipeline Asset_Renderer.asset | 26 +- Assets/Artists/Materials/Default Decal.mat | 145 +++++++ Assets/Artists/Scenes/Workshop.unity | 378 +++++++++++++++++- .../Scripts/UX/UXCuttingToolService.cs | 25 +- .../Artists/Scripts/UnityCuttingToolBrush.cs | 65 +++ Assets/Artists/Scripts/UnityDecalTool.cs | 29 ++ .../Scripts/iFactory.Cutting.Runtime.asmdef | 3 +- Assets/Artists/UX/CuttingPanel.uxml | 16 +- Assets/BITKit/Core/Mod/ModService.cs | 12 + Assets/BITKit/Core/Transform/BITTransform.cs | 12 + .../Unity/Scripts/Mod/UnityModService.cs | 73 +++- .../Unity/Scripts/Transform/UnityTransform.cs | 58 +++ .../Textures/DynamicDecal.renderTexture | 15 +- Assets/iFactory.Cutting/DecalTool.cs | 13 + README.md | 7 + 16 files changed, 832 insertions(+), 45 deletions(-) create mode 100644 Assets/Artists/Arts/Logos/logo_CN_Intelli.png create mode 100644 Assets/Artists/Materials/Default Decal.mat create mode 100644 Assets/Artists/Scripts/UnityDecalTool.cs create mode 100644 Assets/BITKit/Unity/Scripts/Transform/UnityTransform.cs create mode 100644 Assets/iFactory.Cutting/DecalTool.cs diff --git a/Assets/Artists/Arts/Logos/logo_CN_Intelli.png b/Assets/Artists/Arts/Logos/logo_CN_Intelli.png new file mode 100644 index 0000000000000000000000000000000000000000..18a59f9de1a6b09c5da116694334a8ad09058938 GIT binary patch literal 10980 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 button.text =string.IsNullOrEmpty(exportAttribute.Name) ? methodInfo.Name:exportAttribute.Name; - button.clicked += () => + button.clicked += OnClicked; + + return; + void OnClicked() { - methodInfo.Invoke(arg2, null); - }; + try + { + methodInfo.Invoke(arg2, null); + } + catch (TargetInvocationException targetInvocationException) + { + if (targetInvocationException.InnerException is InGameException e is false) return; + switch (e) + { + case {InnerException:not null}: + Alert.Print(e.Message,e.InnerException.Message); + break; + default: + Alert.Print(e.Message,e.Source); + break; + } + } + } } } } diff --git a/Assets/Artists/Scripts/UnityCuttingToolBrush.cs b/Assets/Artists/Scripts/UnityCuttingToolBrush.cs index 421e38d0..6f81bc57 100644 --- a/Assets/Artists/Scripts/UnityCuttingToolBrush.cs +++ b/Assets/Artists/Scripts/UnityCuttingToolBrush.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Runtime.CompilerServices; using BITKit; using BITKit.StateMachine; +using PaintIn3D; using Unity.Collections.LowLevel.Unsafe; using Unity.Mathematics; using UnityEngine; @@ -174,5 +175,69 @@ namespace BITFactory.Cutting } } } + /// + /// 填充笔刷,用于填充应该被裁剪的区域,类似油漆桶 + /// + [Serializable] + public sealed class CuttingFillBrush : CuttingToolBrush + { + [SerializeField] private Transform transform; + public override string Name => "填充切削"; + public override string Description => "仅在该程序中使用,用于预览被裁剪的区域"; + + [Export(name:"自动填充")] + private void AutoFill() + { + var p3dTexture = transform.GetComponentInChildren(); + + var texture = p3dTexture.Current.ToTexture2D(); + + var colors = texture.GetPixels(); + + var size = new float2(texture.width, texture.height); + //洪水填充 + + throw new InGameException("暂未实现,算法有些复杂"); + } + } + /// + /// 印花笔刷,用于在表面上印花 + /// + [Serializable] + public sealed class DecalBrush : CuttingToolBrush + { + public override string Name => "印花笔刷"; + public override string Description => "在表面上印花,例如预览打印文字或者Logo,图案等"; + + [Inject] + private IDecalTool _decalTool; + + private ITransform _previewTransform; + + public override void OnStateEntry(IState old) + { + base.OnStateEntry(old); + _previewTransform = _decalTool.Create(string.Empty); + } + public override void OnStateExit(IState old, IState newState) + { + base.OnStateExit(old, newState); + _previewTransform.Dispose(); + } + public override void HandlePoint(bool isPreview, float3 normal, float3 point) + { + if (isPreview is false) return; + _previewTransform.Position = point+(float3)Vector3.up*0.1f; + + + _previewTransform.Rotation = Quaternion.LookRotation(normal); + } + + [Export(name:"选择图片")] + private void SelectImage() + { + throw new InGameException("暂未实现",new NotImplementedException("需要一些小小的base64转换才能储存,暂未实现")); + } + } } \ No newline at end of file diff --git a/Assets/Artists/Scripts/UnityDecalTool.cs b/Assets/Artists/Scripts/UnityDecalTool.cs new file mode 100644 index 00000000..53d2facb --- /dev/null +++ b/Assets/Artists/Scripts/UnityDecalTool.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using BITKit; +using BITKit.Entities; +using Unity.Mathematics; +using UnityEngine; +using UnityEngine.Rendering.Universal; + +namespace BITFactory.Cutting +{ + [CustomType(typeof(IDecalTool))] + public class UnityDecalTool : EntityBehavior,IDecalTool + { + [SerializeField] private DecalProjector decalProjector; + private void Start() + { + decalProjector.gameObject.SetActive(false); + } + public ITransform Create(string base64, float3 position = default, quaternion rotation = default, float3 scale = default) + { + + var decal = Instantiate(decalProjector, position, rotation); + decal.gameObject.SetActive(true); + return decal.transform.ToUnityTransform(); + } + } + +} diff --git a/Assets/Artists/Scripts/iFactory.Cutting.Runtime.asmdef b/Assets/Artists/Scripts/iFactory.Cutting.Runtime.asmdef index ed22c497..fe727818 100644 --- a/Assets/Artists/Scripts/iFactory.Cutting.Runtime.asmdef +++ b/Assets/Artists/Scripts/iFactory.Cutting.Runtime.asmdef @@ -12,7 +12,8 @@ "GUID:517785bb4600a5140b47eac5fa49b8fc", "GUID:d525ad6bd40672747bde77962f1c401e", "GUID:49b49c76ee64f6b41bf28ef951cb0e50", - "GUID:f51ebe6a0ceec4240a699833d6309b23" + "GUID:f51ebe6a0ceec4240a699833d6309b23", + "GUID:15fc0a57446b3144c949da3e2b9737a9" ], "includePlatforms": [], "excludePlatforms": [], diff --git a/Assets/Artists/UX/CuttingPanel.uxml b/Assets/Artists/UX/CuttingPanel.uxml index adab5c4f..50584f4d 100644 --- a/Assets/Artists/UX/CuttingPanel.uxml +++ b/Assets/Artists/UX/CuttingPanel.uxml @@ -10,11 +10,21 @@ - + + + + + + + + + + + @@ -73,8 +83,8 @@ - - + + diff --git a/Assets/BITKit/Core/Mod/ModService.cs b/Assets/BITKit/Core/Mod/ModService.cs index 77825e33..73559023 100644 --- a/Assets/BITKit/Core/Mod/ModService.cs +++ b/Assets/BITKit/Core/Mod/ModService.cs @@ -184,6 +184,9 @@ namespace BITKit.Mod OnLocked?.Invoke(value); } } + + public static event Action OnPackageLoad; + public static event Action OnPackageLoaded; public static event Action OnModLoad; public static event Action OnModLoaded; @@ -409,6 +412,14 @@ namespace BITKit.Mod if(package.EntryPoint is null) throw new InvalidOperationException("空入口,无法识别类型"); path = Path.Combine(Path.GetDirectoryName(path)!, package.EntryPoint); if(File.Exists(path) is false) throw new InvalidOperationException($"未找到入口文件:{path}"); + + OnPackageLoad?.Invoke(package); + + foreach (var name in package.Dlls) + { + + } + var fileInfo = new FileInfo(path); switch (fileInfo.Extension) { @@ -429,6 +440,7 @@ namespace BITKit.Mod #endif } + OnPackageLoaded?.Invoke(package); } public static void Load(IMod mod) { diff --git a/Assets/BITKit/Core/Transform/BITTransform.cs b/Assets/BITKit/Core/Transform/BITTransform.cs index fb2ede09..e7a5f39d 100644 --- a/Assets/BITKit/Core/Transform/BITTransform.cs +++ b/Assets/BITKit/Core/Transform/BITTransform.cs @@ -1,3 +1,6 @@ +using System; +using Unity.Mathematics; + namespace BITKit { public enum TransformMode : int @@ -7,4 +10,13 @@ namespace BITKit Rotate, Scale, } + public interface ITransform:IDisposable + { + float3 LocalPosition { get; set; } + float3 Position { get; set; } + quaternion LocalRotation { get; set; } + quaternion Rotation { get; set; } + float3 LocalScale { get; set; } + float4x4 Matrix { get; set; } + } } \ No newline at end of file diff --git a/Assets/BITKit/Unity/Scripts/Mod/UnityModService.cs b/Assets/BITKit/Unity/Scripts/Mod/UnityModService.cs index 52afb0c0..4af67096 100644 --- a/Assets/BITKit/Unity/Scripts/Mod/UnityModService.cs +++ b/Assets/BITKit/Unity/Scripts/Mod/UnityModService.cs @@ -25,31 +25,18 @@ namespace BITKit.Mod BIT4Log.Log($"{nameof(System.Linq)}位于{typeof(Enumerable).Assembly.Location}"); } - - + + foreach (var x in referencedAssemblies) { var dllName = x.Value.Contains(".dll") ? x.Value : $"{x.Value}.dll"; -#if UNITY_EDITOR - var dll = System.IO.Path.Combine(Environment.CurrentDirectory, "Library", "ScriptAssemblies",dllName); - var folder = EditorApplication.applicationPath; - folder = Path.GetDirectoryName(folder); - if(File.Exists(dll) is false) - { - dll = Path.Combine(folder,"Data", "MonoBleedingEdge", "lib","mono","unityjit-win32",dllName); - } - if (File.Exists(dll) is false) - { - dll = Path.Combine(folder,"Data", "MonoBleedingEdge", "lib","mono","unityjit-win32","Facades",dllName); - } -#else - var dll = System.IO.Path.Combine(Environment.CurrentDirectory,$"{Application.productName}_Data", "Managed", dllName); -#endif - - if (System.IO.File.Exists(dll) is false) + + if (SearchDll(dllName,out var dll) is false) { BIT4Log.Warning($"未找到:{dll}"); + continue; } + BITSharp.ReferencedAssemblies.Add(@$"""{dll}"""); } @@ -67,6 +54,9 @@ namespace BITKit.Mod destroyCancellationToken.Register(ModService.Dispose); if (!loadLocalPackageOnStart) return; + + ModService.OnPackageLoad+=OnPackageLoad; + var packages = await ModService.SearchPackages(); if (destroyCancellationToken.IsCancellationRequested) return; @@ -75,6 +65,51 @@ namespace BITKit.Mod await ModService.LoadFromPackage(package.PackagePath); if (destroyCancellationToken.IsCancellationRequested) return; } + + + destroyCancellationToken.Register(() => + { + ModService.OnPackageLoad-=OnPackageLoad; + }); + } + + private void OnPackageLoad(ModPackage obj) + { + var loadedDlls = referencedAssemblies.Cast(); + var reportBuilder = new System.Text.StringBuilder(); + + //对比已加载的dll和当前引用的dll + foreach (var x in obj.Dlls.Except(loadedDlls)) + { + if (SearchDll(x, out var dll) is false) + { + BIT4Log.Warning($"未找到:{dll}"); + continue; + } + + BITSharp.ReferencedAssemblies.Add(@$"""{dll}"""); + reportBuilder.AppendLine($"加载:{dll}"); + } + BIT4Log.Log(reportBuilder.ToString()); + } + private bool SearchDll(string dllName,out string dll,params string[] moreFolder) + { +#if UNITY_EDITOR + dll = System.IO.Path.Combine(Environment.CurrentDirectory, "Library", "ScriptAssemblies", dllName); + var folder = EditorApplication.applicationPath; + folder = Path.GetDirectoryName(folder); + if(File.Exists(dll) is false) + { + dll = Path.Combine(folder,"Data", "MonoBleedingEdge", "lib","mono","unityjit-win32",dllName); + } + if (File.Exists(dll) is false) + { + dll = Path.Combine(folder,"Data", "MonoBleedingEdge", "lib","mono","unityjit-win32","Facades",dllName); + } +#else + var dll = System.IO.Path.Combine(Environment.CurrentDirectory,$"{Application.productName}_Data", "Managed", dllName); +#endif + return File.Exists(dll); } } } diff --git a/Assets/BITKit/Unity/Scripts/Transform/UnityTransform.cs b/Assets/BITKit/Unity/Scripts/Transform/UnityTransform.cs new file mode 100644 index 00000000..23d3807d --- /dev/null +++ b/Assets/BITKit/Unity/Scripts/Transform/UnityTransform.cs @@ -0,0 +1,58 @@ +using Unity.Mathematics; +using UnityEngine; +using UnityEngine.UI; + +namespace BITKit +{ + public static class TransformExtensions + { + public static UnityTransform ToUnityTransform(this Transform transform) + { + return new UnityTransform(transform); + } + } + public readonly struct UnityTransform:ITransform + { + private readonly Transform _transform; + public UnityTransform(Transform transform) + { + _transform = transform; + } + public void Dispose() + { + if (_transform) + Object.Destroy(_transform.gameObject); + } + + public float3 LocalPosition + { + get => _transform.localPosition; + set => _transform.localPosition = value; + } + public float3 Position + { + get => _transform.position; + set => _transform.position = value; + } + public quaternion LocalRotation + { + get => _transform.localRotation; + set => _transform.localRotation = value; + } + public quaternion Rotation + { + get => _transform.rotation; + set => _transform.rotation = value; + } + public float3 LocalScale + { + get => _transform.localScale; + set => _transform.localScale = value; + } + public float4x4 Matrix + { + get =>new float4x4(_transform); + set => _transform.SetPositionAndRotation(value.c3.xyz,quaternion.LookRotation(value.c2.xyz,value.c1.xyz)); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CW/PaintIn3D/Examples/Textures/DynamicDecal.renderTexture b/Assets/Plugins/CW/PaintIn3D/Examples/Textures/DynamicDecal.renderTexture index 4ab8f01a..9ab24b53 100644 --- a/Assets/Plugins/CW/PaintIn3D/Examples/Textures/DynamicDecal.renderTexture +++ b/Assets/Plugins/CW/PaintIn3D/Examples/Textures/DynamicDecal.renderTexture @@ -3,24 +3,30 @@ --- !u!84 &8400000 RenderTexture: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} - m_PrefabInternal: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} m_Name: DynamicDecal m_ImageContentsHash: serializedVersion: 2 Hash: 00000000000000000000000000000000 m_ForcedFallbackFormat: 4 m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 5 m_Width: 512 m_Height: 512 m_AntiAliasing: 1 - m_DepthFormat: 2 - m_ColorFormat: 0 + m_MipCount: -1 + m_DepthStencilFormat: 92 + m_ColorFormat: 8 m_MipMap: 0 m_GenerateMips: 1 m_SRGB: 0 m_UseDynamicScale: 0 m_BindMS: 0 + m_EnableCompatibleFormat: 1 + m_EnableRandomWrite: 0 m_TextureSettings: serializedVersion: 2 m_FilterMode: 1 @@ -31,3 +37,4 @@ RenderTexture: m_WrapW: 1 m_Dimension: 2 m_VolumeDepth: 1 + m_ShadowSamplingMode: 2 diff --git a/Assets/iFactory.Cutting/DecalTool.cs b/Assets/iFactory.Cutting/DecalTool.cs new file mode 100644 index 00000000..0cb2b350 --- /dev/null +++ b/Assets/iFactory.Cutting/DecalTool.cs @@ -0,0 +1,13 @@ + +using System.Diagnostics; +using System.Net.Configuration; +using BITKit; +using Unity.Mathematics; + +namespace BITFactory.Cutting +{ + public interface IDecalTool + { + ITransform Create(string base64,float3 position=default, quaternion rotation=default, float3 scale= default); + } +} \ No newline at end of file diff --git a/README.md b/README.md index 2eff014b..b03e1208 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,13 @@ **操作系统:** 仅限于64位`Windows 10`,`Windows 11`或以上 ## 更新日志 +### 2024年3月11日 +- 添加了`印花`必刷,可以预览贴纸或者打印的效果,例如`logo`,`文字`或者`图案` +- 调整命令与功能面板从`右侧中心`移动到`右侧顶部` +- 在左下角添加了遥测信息,包括`FPS`,`Ping`和`帧率限制` +- 添加了左下角的`logo` +- 添加了自动加载Dll,现在可以dll会自动从`package.json`所在的目录自动搜索 +- 添加了`自动填充`的按钮,将会在准备好时可用(占位符) ### 2024年3月5日 - 更改动态编译器从`MCS`更改为`Roslyn` - 添加了在左下角的`按键提示`