-
Hi, I'm wrapping some ImGui functions, but ran into an issue. My current, naive implementation where I define a new bool mrb_define_module_function(mrb, ImGui_module, "show_demo_window", [](mrb_state* mrb, mrb_value self) -> mrb_value {
bool open;
mrb_get_args(mrb, "|b", &open);
ImGui::ShowDemoWindow(&open);
return mrb_nil_value();
}, MRB_ARGS_OPT(1)); This is a snippet of how I'm invoking my wrapped function: if @show_demo_window
ImGui.show_demo_window @show_demo_window
end What should happen is that the How might I accomplish what I'm looking to do here? Thank you for any help! |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 4 replies
-
As far as I can see, there are two things that are clearly wrong with the code you presented.
Here's an example fix: --- #5618.cxx.orig
+++ #5618.cxx
@@ -1,6 +1,7 @@
mrb_define_module_function(mrb, ImGui_module, "show_demo_window", [](mrb_state* mrb, mrb_value self) -> mrb_value {
- bool open;
- mrb_get_args(mrb, "|b", &open);
+ mrb_bool aopen = TRUE;
+ mrb_get_args(mrb, "|b", &aopen);
+ bool open = aopen ? true : false;
ImGui::ShowDemoWindow(&open);
return mrb_nil_value();
}, MRB_ARGS_OPT(1)); |
Beta Was this translation helpful? Give feedback.
-
Here is what I'm currently using for static const mrb_data_type IntPtr_type = {"IntPtr", mrb_free};
static const mrb_data_type FloatPtr_type = {"FloatPtr", mrb_free};
static const mrb_data_type BoolPtr_type = {"BoolPtr", mrb_free};
// ...
RClass* const IntPtr_class = mrb_define_class(mrb, "IntPtr", mrb->object_class);
MRB_SET_INSTANCE_TT(IntPtr_class, MRB_TT_DATA);
mrb_define_method(mrb, IntPtr_class, "initialize", [](mrb_state* mrb, mrb_value self) -> mrb_value {
mrb_int n;
mrb_get_args(mrb, "i", &n);
int* data = (int*)DATA_PTR(self);
if(data) { mrb_free(mrb, data); }
mrb_data_init(self, nullptr, &IntPtr_type);
data = (int*)malloc(sizeof(int));
*data = n;
mrb_data_init(self, data, &IntPtr_type);
return self;
}, MRB_ARGS_REQ(1));
mrb_define_method(mrb, IntPtr_class, "value", [](mrb_state* mrb, mrb_value self) -> mrb_value {
int* data = (int*)DATA_PTR(self);
return mrb_fixnum_value(*data);
}, MRB_ARGS_NONE());
mrb_define_method(mrb, IntPtr_class, "value=", [](mrb_state* mrb, mrb_value self) -> mrb_value {
mrb_int n;
mrb_get_args(mrb, "i", &n);
int* data = (int*)DATA_PTR(self);
*data = n;
return mrb_nil_value();
}, MRB_ARGS_REQ(1));
mrb_define_method(mrb, IntPtr_class, "to_s", [](mrb_state* mrb, mrb_value self) -> mrb_value {
int* data = (int*)DATA_PTR(self);
std::string str = std::to_string(*data);
const char* c_str = str.c_str();
mrb_value rstr = mrb_str_new_cstr(mrb, c_str);
return rstr;
}, MRB_ARGS_NONE());
RClass* const FloatPtr_class = mrb_define_class(mrb, "FloatPtr", mrb->object_class);
MRB_SET_INSTANCE_TT(FloatPtr_class, MRB_TT_DATA);
mrb_define_method(mrb, FloatPtr_class, "initialize", [](mrb_state* mrb, mrb_value self) -> mrb_value {
mrb_float f;
mrb_get_args(mrb, "f", &f);
float* data = (float*)DATA_PTR(self);
if(data) { mrb_free(mrb, data); }
mrb_data_init(self, nullptr, &FloatPtr_type);
data = (float*)malloc(sizeof(float));
*data = f;
mrb_data_init(self, data, &FloatPtr_type);
return self;
}, MRB_ARGS_REQ(1));
mrb_define_method(mrb, FloatPtr_class, "value", [](mrb_state* mrb, mrb_value self) -> mrb_value {
float* data = (float*)DATA_PTR(self);
return mrb_float_value(mrb, *data);
}, MRB_ARGS_NONE());
mrb_define_method(mrb, FloatPtr_class, "value=", [](mrb_state* mrb, mrb_value self) -> mrb_value {
mrb_float f;
mrb_get_args(mrb, "f", &f);
float* data = (float*)DATA_PTR(self);
*data = f;
return mrb_nil_value();
}, MRB_ARGS_REQ(1));
mrb_define_method(mrb, FloatPtr_class, "to_s", [](mrb_state* mrb, mrb_value self) -> mrb_value {
float* data = (float*)DATA_PTR(self);
std::string str = std::to_string(*data);
const char* c_str = str.c_str();
mrb_value rstr = mrb_str_new_cstr(mrb, c_str);
return rstr;
}, MRB_ARGS_NONE());
RClass* const BoolPtr_class = mrb_define_class(mrb, "BoolPtr", mrb->object_class);
MRB_SET_INSTANCE_TT(BoolPtr_class, MRB_TT_DATA);
mrb_define_method(mrb, BoolPtr_class, "initialize", [](mrb_state* mrb, mrb_value self) -> mrb_value {
mrb_bool b;
mrb_get_args(mrb, "b", &b);
bool* data = (bool*)DATA_PTR(self);
if(data) { mrb_free(mrb, data); }
mrb_data_init(self, nullptr, &BoolPtr_type);
data = (bool*)malloc(sizeof(bool));
*data = b;
mrb_data_init(self, data, &BoolPtr_type);
return self;
}, MRB_ARGS_REQ(1));
mrb_define_method(mrb, BoolPtr_class, "value", [](mrb_state* mrb, mrb_value self) -> mrb_value {
bool* data = (bool*)DATA_PTR(self);
return mrb_bool_value(*data);
}, MRB_ARGS_NONE());
mrb_define_method(mrb, BoolPtr_class, "value=", [](mrb_state* mrb, mrb_value self) -> mrb_value {
mrb_bool b;
mrb_get_args(mrb, "b", &b);
bool* data = (bool*)DATA_PTR(self);
*data = b;
return mrb_nil_value();
}, MRB_ARGS_REQ(1));
mrb_define_method(mrb, BoolPtr_class, "to_s", [](mrb_state* mrb, mrb_value self) -> mrb_value {
bool* data = (bool*)DATA_PTR(self);
std::string str = std::to_string(*data);
const char* c_str = str.c_str();
mrb_value rstr = mrb_str_new_cstr(mrb, c_str);
return rstr;
}, MRB_ARGS_NONE()); Using as argument: // IntPtr example
mrb_define_module_function(mrb, ImGui_module, "slider_int", [](mrb_state* mrb, mrb_value self) -> mrb_value {
const char* label;
int* v_ptr;
mrb_int v_min;
mrb_int v_max;
mrb_get_args(mrb, "zdii", &label, &v_ptr, &IntPtr_type, &v_min, &v_max);
// std::cout << "v_ptr: " << v_ptr << ", *v_ptr: " << *v_ptr << std::endl;
ImGui::SliderInt(label, v_ptr, v_min, v_max);
return mrb_nil_value();
}, MRB_ARGS_REQ(4));
// FloatPtr example
mrb_define_module_function(mrb, ImGui_module, "slider_float", [](mrb_state* mrb, mrb_value self) -> mrb_value {
const char* label;
float* v_ptr;
mrb_float v_min;
mrb_float v_max;
mrb_get_args(mrb, "zdff", &label, &v_ptr, &FloatPtr_type, &v_min, &v_max);
// std::cout << "v_ptr: " << v_ptr << ", *v_ptr: " << *v_ptr << std::endl;
ImGui::SliderFloat(label, v_ptr, v_min, v_max);
return mrb_nil_value();
}, MRB_ARGS_REQ(4));
// BoolPtr example
mrb_define_module_function(mrb, ImGui_module, "show_demo_window", [](mrb_state* mrb, mrb_value self) -> mrb_value {
bool* p_open;
switch(mrb_get_args(mrb, "|d", &p_open, &BoolPtr_type)) {
case 0:
ImGui::ShowDemoWindow();
break;
case 1:
// std::cout << "p_open: " << p_open << ", *p_open: " << *p_open << std::endl;
ImGui::ShowDemoWindow(p_open);
break;
}
return mrb_nil_value();
}, MRB_ARGS_OPT(1)); Using in mruby code @show_demo_window = BoolPtr.new true
@my_float ||= FloatPtr.new 1.2
@my_int ||= IntPtr.new 3
# ...
if @show_demo_window.value
ImGui.show_demo_window @show_demo_window
end
# ...
@test_window_open ||= BoolPtr.new true
if @test_window_open.value
ImGui.begin("My test window!", @test_window_open) do
ImGui.slider_float "FOV", @my_float, 0, 10
ImGui.slider_int "My Int", @my_int, 0, 10
end
end |
Beta Was this translation helpful? Give feedback.
Here is what I'm currently using for
int*
,float*
, andbool*
.