c# update callback

This commit is contained in:
Timerix 2024-09-10 23:23:37 +05:00
parent e71a6b71fe
commit ec7a8de0cf
8 changed files with 33 additions and 29 deletions

View File

@ -1,18 +0,0 @@
using System;
class A {
public int a = 0;
public int b = 0;
public int c = 0;
static public int Method(){
return 0;
}
static public int Method(float f, byte b){
return 1;
}
static public int Method(byte b, float f){
Console.WriteLine($"Hello from C#! Received arguments: b={b} f={f}");
return 2;
}
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework> <TargetFramework>net48</TargetFramework>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<RootNamespace>Ougge</RootNamespace> <RootNamespace>Ougge</RootNamespace>
<ImplicitUsings>disable</ImplicitUsings> <ImplicitUsings>disable</ImplicitUsings>

View File

@ -1,14 +1,16 @@
using System; using System;
using System.Data; using System.Data;
namespace Ougge;
public abstract class ScriptBase { public abstract class ScriptBase {
public virtual void Update(double deltaTime) {} public virtual void Update(double deltaTime) {}
} }
public class Script : ScriptBase public class ExampleScript : ScriptBase
{ {
public override void Update(double deltaTime) public override void Update(double deltaTime)
{ {
Console.WriteLine() Console.WriteLine($"C# deltaTime {deltaTime}");
} }
} }

View File

@ -21,7 +21,7 @@ f32 MainWindow::getDPI(){
return dpi; return dpi;
} }
void MainWindow::open(const char* window_title, UpdatingFunc _update){ void MainWindow::open(const char* window_title, UpdateFunc_t _update){
update = _update; update = _update;
SDL_TRY(SDL_Init(SDL_INIT_EVERYTHING)); SDL_TRY(SDL_Init(SDL_INIT_EVERYTHING));

View File

@ -4,6 +4,7 @@
#include <imgui.h> #include <imgui.h>
#include "../std.hpp" #include "../std.hpp"
#include "../time.hpp" #include "../time.hpp"
#include <functional>
/// converts hex color to float vector /// converts hex color to float vector
#define RGBAHexToF(R8,G8,B8,A8) ImVec4(((u8)35)/255.0f, ((u8)35)/255.0f, ((u8)50)/255.0f, ((u8)255)/255.0f) #define RGBAHexToF(R8,G8,B8,A8) ImVec4(((u8)35)/255.0f, ((u8)35)/255.0f, ((u8)50)/255.0f, ((u8)255)/255.0f)
@ -14,7 +15,7 @@ namespace ougge::GUI {
#define default_font "DroidSans" #define default_font "DroidSans"
using UpdatingFunc = void (*)(f64 deltaTime); using UpdateFunc_t = std::function<void(f64)>;
class MainWindow { class MainWindow {
public: public:
@ -22,7 +23,7 @@ public:
f32 default_font_size = 14.0f; f32 default_font_size = 14.0f;
int fps_max = 60; int fps_max = 60;
// called on each frame // called on each frame
UpdatingFunc update = nullptr; UpdateFunc_t update = nullptr;
private: private:
bool loop_running = false; bool loop_running = false;
@ -32,7 +33,7 @@ private:
SDL_Renderer* sdl_renderer = nullptr; SDL_Renderer* sdl_renderer = nullptr;
public: public:
void open(const char* window_title, UpdatingFunc update); void open(const char* window_title, UpdateFunc_t update);
void startUpdateLoop(); void startUpdateLoop();
void close(); void close();

View File

@ -4,6 +4,7 @@
#include "../UsefulException.hpp" #include "../UsefulException.hpp"
#include "../format.hpp" #include "../format.hpp"
#include <vector> #include <vector>
#include <type_traits>
#include <mono/metadata/metadata.h> #include <mono/metadata/metadata.h>
#include <mono/metadata/assembly.h> #include <mono/metadata/assembly.h>
#include <mono/metadata/object.h> #include <mono/metadata/object.h>
@ -66,7 +67,9 @@ class Method<ReturnT(ArgTypes...)>
MonoMethod* method_ptr; MonoMethod* method_ptr;
public: public:
ReturnT operator()(MonoObject* class_instance, ArgTypes... args) {
template<typename RT = ReturnT>
std::enable_if_t<!std::is_void<RT>::value, RT> operator()(MonoObject* class_instance, ArgTypes... args) const {
void* arg_array[] = { valueToVoidPtr(args)..., nullptr }; void* arg_array[] = { valueToVoidPtr(args)..., nullptr };
MonoObject* ex = nullptr; MonoObject* ex = nullptr;
MonoObject* result = mono_runtime_invoke(method_ptr, class_instance, arg_array, &ex); MonoObject* result = mono_runtime_invoke(method_ptr, class_instance, arg_array, &ex);
@ -74,6 +77,14 @@ public:
mono_print_unhandled_exception(ex); mono_print_unhandled_exception(ex);
return valueFromMonoObject<ReturnT>(result); return valueFromMonoObject<ReturnT>(result);
}; };
template<typename RT = ReturnT>
std::enable_if_t<std::is_void<RT>::value, RT> operator()(MonoObject* class_instance, ArgTypes... args) const {
void* arg_array[] = { valueToVoidPtr(args)..., nullptr };
MonoObject* ex = nullptr;
mono_runtime_invoke(method_ptr, class_instance, arg_array, &ex);
if(ex)
mono_print_unhandled_exception(ex);
};
/// all types must implement getClass<T>() /// all types must implement getClass<T>()
Method(MonoClass* target_class, const std::string& name){ Method(MonoClass* target_class, const std::string& name){
@ -109,6 +120,7 @@ public:
RuntimeJIT(const RuntimeJIT&) = delete; RuntimeJIT(const RuntimeJIT&) = delete;
~RuntimeJIT(); ~RuntimeJIT();
inline MonoDomain* getDomain() { return domain; }
std::shared_ptr<Assembly> loadAssembly(const std::string& name); std::shared_ptr<Assembly> loadAssembly(const std::string& name);
}; };

View File

@ -19,7 +19,7 @@ RuntimeJIT::~RuntimeJIT(){
} }
std::shared_ptr<Assembly> RuntimeJIT::loadAssembly(const std::string &name){ std::shared_ptr<Assembly> RuntimeJIT::loadAssembly(const std::string &name){
MonoAssembly* ptr = mono_domain_assembly_open(domain, "app.exe"); MonoAssembly* ptr = mono_domain_assembly_open(domain, name.c_str());
if(!ptr) if(!ptr)
throw UsefulException(format("can't load assembly '%s'", name.c_str())); throw UsefulException(format("can't load assembly '%s'", name.c_str()));
return std::make_shared<Assembly>(ptr); return std::make_shared<Assembly>(ptr);

View File

@ -9,7 +9,7 @@
using namespace ougge; using namespace ougge;
std::vector<GUI::UpdatingFunc> updateCallbacks; std::vector<GUI::UpdateFunc_t> updateCallbacks;
void update(f64 deltaTime){ void update(f64 deltaTime){
for(auto upd : updateCallbacks){ for(auto upd : updateCallbacks){
@ -25,7 +25,14 @@ int main(int argc, const char** argv){
Mono::RuntimeJIT mono; Mono::RuntimeJIT mono;
std::cout<<"initialized mono jit runtime"<<std::endl; std::cout<<"initialized mono jit runtime"<<std::endl;
updateCallbacks.push_back([](f64 deltaTime) -> void { std::cout<<"deltaTime: "<<deltaTime<<std::endl; }); auto a = mono.loadAssembly("Ougge.dll");
auto c = a->getClass("Ougge", "ExampleScript");
auto scriptInstance = mono_object_new(mono.getDomain(), c);
mono_runtime_object_init(scriptInstance);
auto scriptUpdate = Mono::Method<void(f64)>(c, "Update");
updateCallbacks.push_back([scriptInstance, scriptUpdate](f64 deltaTime) -> void {
scriptUpdate(scriptInstance, deltaTime);
});
GUI::MainWindow w; GUI::MainWindow w;
w.open("ougge", update); w.open("ougge", update);