From fe3d029e7468d173b055e4b0a841244b16b3a1f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 9 Jun 2025 20:19:13 -0500 Subject: [PATCH] feat: ffi --- .gitignore | 227 +++++++++++++++++- .vscode/tasks.json | 41 ++++ BlitzKit.sln | 27 +++ bun.lockb | Bin 316528 -> 321118 bytes package.json | 5 +- packages/website-ue/package.json | 4 + .../website-ue/src/pages/internal/_index.tsx | 9 + .../src/pages/internal/ffi/_index.tsx | 4 +- src/BlitzKit.FFI/BlitzKit.FFI.csproj | 10 + src/BlitzKit.FFI/FFI.cs | 15 ++ 10 files changed, 337 insertions(+), 5 deletions(-) create mode 100644 .vscode/tasks.json create mode 100644 BlitzKit.sln create mode 100644 src/BlitzKit.FFI/BlitzKit.FFI.csproj create mode 100644 src/BlitzKit.FFI/FFI.cs diff --git a/.gitignore b/.gitignore index 3804cd921..513cc372b 100644 --- a/.gitignore +++ b/.gitignore @@ -22,9 +22,230 @@ depots public/sitemap* /firebase.json target -# packages/core/src/protos/*.ts /.vercel /.astro .vercel -/src -/packages/bot/src/prisma \ No newline at end of file +/packages/bot/src/prisma + +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates +*.userprefs +mono_crash.* +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +[Aa][Rr][Mm]64[Ee][Cc]/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ +.vs/ +Generated\ Files/ +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* +*.VisualState.xml +TestResult.xml +nunit-*.xml +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c +BenchmarkDotNet.Artifacts/ +project.lock.json +project.fragment.lock.json +artifacts/ +ScaffoldingReadMe.txt +StyleCopReport.xml +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.idb +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +!Directory.Build.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc +_Chutzpah* +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb +*.psess +*.vsp +*.vspx +*.sap +*.e2e +$tf/ +*.gpState +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user +_TeamCity* +*.dotCover +.axoCover/* +!.axoCover/settings.json +coverage*.json +coverage*.xml +coverage*.info +*.coverage +*.coveragexml +_NCrunch_* +.NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* +*.mm.* +AutoTest.Net/ +.sass-cache/ +[Ee]xpress/ +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html +publish/ +*.[Pp]ublish.xml +*.azurePubxml +*.pubxml +*.publishproj +PublishScripts/ +*.nupkg +*.snupkg +**/[Pp]ackages/* +!**/[Pp]ackages/build/ +*.nuget.props +*.nuget.targets +csx/ +*.build.csdef +ecf/ +rcf/ +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload +*.[Cc]ache +!?*.[Cc]ache/ +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +Generated_Code/ +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak +*.mdf +*.ldf +*.ndf +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl +FakesAssemblies/ +*.GhostDoc.xml +.ntvs_analysis.dat +node_modules/ +*.plg +*.opt +*.vbw +*.vbp +*.dsw +*.dsp +*.ncb +*.aps +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions +.paket/paket.exe +paket-files/ +.fake/ +.cr/personal +__pycache__/ +*.pyc + +*.tss +*.jmconfig +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs +OpenCover/ +ASALocalRun/ +*.binlog +.aws-sam +*.nvuser +.mfractor/ +.localhistory/ +.vshistory/ +healthchecksdb +MigrationBackup/ +.ionide/ +FodyWeavers.xsd +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace +.history/ +*.cab +*.msi +*.msix +*.msm +*.msp +*.sln.iml \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..98ad19c2a --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/BlitzKit.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/BlitzKit.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/BlitzKit.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/BlitzKit.sln b/BlitzKit.sln new file mode 100644 index 000000000..5c42778f9 --- /dev/null +++ b/BlitzKit.sln @@ -0,0 +1,27 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F23F76D4-C350-4BBA-9DF1-E67C5CD391B1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlitzKit.FFI", "src\BlitzKit.FFI\BlitzKit.FFI.csproj", "{8E798C66-C863-4A67-87EA-853109EEE037}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8E798C66-C863-4A67-87EA-853109EEE037}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E798C66-C863-4A67-87EA-853109EEE037}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E798C66-C863-4A67-87EA-853109EEE037}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E798C66-C863-4A67-87EA-853109EEE037}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {8E798C66-C863-4A67-87EA-853109EEE037} = {F23F76D4-C350-4BBA-9DF1-E67C5CD391B1} + EndGlobalSection +EndGlobal diff --git a/bun.lockb b/bun.lockb index a9bea9ac71664d3dc35d0f01e5a8531be84b32cb..ce79beddc9bc7aab3971e7c16411c07029629205 100644 GIT binary patch delta 63129 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 X((6vD;A%qdQ!7+We>Ay5aLE4xiSn`f diff --git a/package.json b/package.json index ca1be902f..9171bf7e0 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,10 @@ "preview:website": "cd packages/website && bun run preview", "build:reviews": "cd packages/scripts && bun build:reviews", "build:ids": "cd packages/scripts && bun build:ids", - "prunestrings": "cd packages/scripts && bun prunestrings" + "prunestrings": "cd packages/scripts && bun prunestrings", + "build:ffi": "bun build:windows:ffi", + "build:windows:ffi": "dotnet publish src/BlitzKit.FFI -r win-x64 /p:PublishAot=true", + "build:linux:ffi": "dotnet publish src/BlitzKit.FFI -r linux-x64 /p:PublishAot=true" }, "license": "MIT", "dependencies": { diff --git a/packages/website-ue/package.json b/packages/website-ue/package.json index 56ea0302e..1994f4136 100644 --- a/packages/website-ue/package.json +++ b/packages/website-ue/package.json @@ -20,18 +20,22 @@ "@radix-ui/themes": "^3.1.4", "@react-three/drei": "^9.115.0", "@react-three/fiber": "^8.17.10", + "@types/ffi-napi": "^4.0.10", "@types/lodash-es": "^4.17.12", "@types/react": "^19.1.5", "@types/react-dom": "^19.1.5", + "@types/ref-napi": "^3.0.12", "@types/semver": "^7.7.0", "@types/three": "^0.160.0", "astro": "^5.8.0", + "ffi-napi": "^4.0.3", "fuzzysort": "^3.1.0", "immer": "^10.1.1", "lodash-es": "^4.17.21", "minimatch": "^10.0.1", "react": "^19.1.0", "react-dom": "^19.1.0", + "ref-napi": "^3.0.3", "semver": "^7.7.2", "sharp": "^0.34.2", "three": "^0.169.0", diff --git a/packages/website-ue/src/pages/internal/_index.tsx b/packages/website-ue/src/pages/internal/_index.tsx index de16e041a..3b93d6e01 100644 --- a/packages/website-ue/src/pages/internal/_index.tsx +++ b/packages/website-ue/src/pages/internal/_index.tsx @@ -22,6 +22,15 @@ export function Page() { + + + Client + + + Location and information of the currently mounted client + + + Bindings diff --git a/packages/website-ue/src/pages/internal/ffi/_index.tsx b/packages/website-ue/src/pages/internal/ffi/_index.tsx index b8672cf94..ce63d776a 100644 --- a/packages/website-ue/src/pages/internal/ffi/_index.tsx +++ b/packages/website-ue/src/pages/internal/ffi/_index.tsx @@ -1,9 +1,11 @@ import { PageWrapper } from 'packages/website-ue/src/components/PageWrapper'; +import { ffi } from 'packages/website-ue/src/core/blitzkit/ffi'; export function Page() { return ( - 🔴 Unmounted + 🟢 {ffi.echo(new Date().toLocaleString())} + ); } diff --git a/src/BlitzKit.FFI/BlitzKit.FFI.csproj b/src/BlitzKit.FFI/BlitzKit.FFI.csproj new file mode 100644 index 000000000..d2f72c49d --- /dev/null +++ b/src/BlitzKit.FFI/BlitzKit.FFI.csproj @@ -0,0 +1,10 @@ + + + Library + net9.0 + true + true + win-x64 + true + + diff --git a/src/BlitzKit.FFI/FFI.cs b/src/BlitzKit.FFI/FFI.cs new file mode 100644 index 000000000..84446b30c --- /dev/null +++ b/src/BlitzKit.FFI/FFI.cs @@ -0,0 +1,15 @@ +using System; +using System.Runtime.InteropServices; + +namespace BlitzKit.FFI; + +public static class FFI +{ + [UnmanagedCallersOnly(EntryPoint = "echo")] + public static IntPtr Echo(IntPtr inputPtr) + { + var input = Marshal.PtrToStringAnsi(inputPtr); + var result = $"BlitzKit FFI echo: {input}"; + return Marshal.StringToHGlobalAnsi(result); + } +}