Skip to content
This repository was archived by the owner on Mar 7, 2023. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions binding-mri/binding-mri.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,12 @@ void fmodCoreBindingInit();
void fmodStudioBindingInit();
#endif
void screenBindingInit();

void compiledShaderBindingInit();
void shaderBindingInit();

void etc_internalBindingInit();

RB_METHOD(mriPrint);
RB_METHOD(mriP);
RB_METHOD(mkxpDataDirectory);
Expand Down Expand Up @@ -144,6 +150,12 @@ static void mriBindingInit()
fmodStudioBindingInit();
#endif
screenBindingInit();

shaderBindingInit();
compiledShaderBindingInit();

etc_internalBindingInit();

rb_define_global_const("MODSHOT_VERSION", rb_str_new_cstr(MODSHOT_VERSION));
if (rgssVer >= 3)
{
Expand Down
5 changes: 5 additions & 0 deletions binding-mri/binding-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,9 @@ DECL_TYPE(Viewport);
DECL_TYPE(Tilemap);
DECL_TYPE(Window);

DECL_TYPE(CustomShader);
DECL_TYPE(CompiledShader);

DECL_TYPE(Vec2);
DECL_TYPE(Vec4);
#endif // BINDINGTYPES_H
36 changes: 18 additions & 18 deletions binding-mri/bitmap-binding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#include "binding-util.h"
#include "binding-types.h"

#include "rb_shader.h"

DEF_TYPE(Bitmap);

static const char *objAsStringPtr(VALUE obj)
Expand Down Expand Up @@ -401,23 +403,6 @@ RB_METHOD(bitmapBlur)
return Qnil;
}

RB_METHOD(bitmapMask)
{
VALUE bitmapObj;
Bitmap *bitmap;

int x = 0;
int y = 0;
rb_get_args(argc, argv, "o|ii", &bitmapObj, &x, &y RB_ARG_END);
bitmap = getPrivateDataCheck<Bitmap>(bitmapObj, BitmapType);

Bitmap *b = getPrivateData<Bitmap>(self);

b->mask(bitmap, x, y);

return Qnil;
}

RB_METHOD(bitmapRadialBlur)
{
Bitmap *b = getPrivateData<Bitmap>(self);
Expand Down Expand Up @@ -451,6 +436,20 @@ RB_METHOD(bitmapInitializeCopy)
}


RB_METHOD(bitmapShade)
{
Bitmap *b = getPrivateData<Bitmap>(self);

VALUE shaderObj;
rb_get_args(argc, argv, "o", &shaderObj RB_ARG_END);

CustomShader *shader = getPrivateDataCheck<CustomShader>(shaderObj, CustomShaderType);

b->shade(shader);

return Qnil;
}

void
bitmapBindingInit()
{
Expand All @@ -474,7 +473,6 @@ bitmapBindingInit()
_rb_define_method(klass, "hue_change", bitmapHueChange);
_rb_define_method(klass, "draw_text", bitmapDrawText);
_rb_define_method(klass, "text_size", bitmapTextSize);
_rb_define_method(klass, "mask", bitmapMask);

//if (rgssVer >= 2)
//{
Expand All @@ -484,5 +482,7 @@ bitmapBindingInit()
_rb_define_method(klass, "radial_blur", bitmapRadialBlur);
//}

_rb_define_method(klass, "shade", bitmapShade);

INIT_PROP_BIND(Bitmap, Font, "font");
}
86 changes: 86 additions & 0 deletions binding-mri/compiled-shader-binding.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#include "binding-util.h"
#include "rb_shader.h"
#include "shadable-element-binding.h"
#include "binding-types.h"

DEF_TYPE(CompiledShader);

RB_METHOD(comiledShaderInitialize)
{
const char *contents;
VALUE aryArgs = 0;
VALUE vertContents = 0;

rb_get_args(argc, argv, "z|oo", &contents, &aryArgs, &vertContents RB_ARG_END);

if (!aryArgs)
aryArgs = rb_ary_new();

CompiledShader *shader;
if (vertContents)
{
shader = new CompiledShader(contents, aryArgs, rb_string_value_cstr(&vertContents));
}
else
{
shader = new CompiledShader(contents, aryArgs);
}
setPrivateData(self, shader);

rb_ary_freeze(aryArgs);

rb_iv_set(self, "args", aryArgs);

return self;
}

RB_METHOD(compiledShaderArgs)
{
RB_UNUSED_PARAM;

return rb_iv_get(self, "args");
}

RB_METHOD(compiledShaderGetContents)
{
RB_UNUSED_PARAM;

CompiledShader *shader = getPrivateData<CompiledShader>(self);

return rb_str_new_cstr(shader->getContents());
}

RB_METHOD(compiledShaderGetVertContents)
{
RB_UNUSED_PARAM;

CompiledShader *shader = getPrivateData<CompiledShader>(self);

return rb_str_new_cstr(shader->getVertContents());
}

RB_METHOD(compiledShaderStringify)
{
RB_UNUSED_PARAM;

CompiledShader *shader = getPrivateData<CompiledShader>(self);

return rb_sprintf(
"<#CompiledShader:%p private_shader=%p args=%" PRIsVALUE ">",
(void *)self,
(void *)shader,
rb_iv_get(self, "args"));
}

void compiledShaderBindingInit()
{
VALUE klass = rb_define_class("CompiledShader", rb_cObject);
rb_define_alloc_func(klass, classAllocate<&CompiledShaderType>);

_rb_define_method(klass, "initialize", comiledShaderInitialize);
_rb_define_method(klass, "args", compiledShaderArgs);
_rb_define_method(klass, "contents", compiledShaderGetContents);
_rb_define_method(klass, "vert_contents", compiledShaderGetVertContents);
_rb_define_method(klass, "to_s", compiledShaderStringify);
_rb_define_method(klass, "inspect", compiledShaderStringify);
}
151 changes: 151 additions & 0 deletions binding-mri/etc-binding-util.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
#ifndef ETC_BINDING_UTIL_H
#define ETC_BINDING_UTIL_H

#define INIT_BIND(Klass) \
{ \
klass = rb_define_class(#Klass, rb_cObject); \
rb_define_alloc_func(klass, classAllocate<&Klass##Type>); \
rb_define_class_method(klass, "_load", Klass##Load); \
serializableBindingInit<Klass>(klass); \
_rb_define_method(klass, "initialize", Klass##Initialize); \
_rb_define_method(klass, "initialize_copy", Klass##InitializeCopy); \
_rb_define_method(klass, "set", Klass##Set); \
_rb_define_method(klass, "==", Klass##Equal); \
_rb_define_method(klass, "===", Klass##Equal); \
_rb_define_method(klass, "eql?", Klass##Equal); \
_rb_define_method(klass, "to_s", Klass##Stringify); \
_rb_define_method(klass, "inspect", Klass##Stringify); \
}

#define INIT_BIND_SERIALIZELESS(Klass) \
{ \
klass = rb_define_class(#Klass, rb_cObject); \
rb_define_alloc_func(klass, classAllocate<&Klass##Type>); \
_rb_define_method(klass, "initialize", Klass##Initialize); \
_rb_define_method(klass, "initialize_copy", Klass##InitializeCopy); \
_rb_define_method(klass, "set", Klass##Set); \
_rb_define_method(klass, "==", Klass##Equal); \
_rb_define_method(klass, "===", Klass##Equal); \
_rb_define_method(klass, "eql?", Klass##Equal); \
_rb_define_method(klass, "to_s", Klass##Stringify); \
_rb_define_method(klass, "inspect", Klass##Stringify); \
}

#define MRB_ATTR_R(Class, attr) mrb_define_method(mrb, klass, #attr, Class##Get_##attr, MRB_ARGS_NONE())
#define MRB_ATTR_W(Class, attr) mrb_define_method(mrb, klass, #attr "=", Class##Set_##attr, MRB_ARGS_REQ(1))
#define MRB_ATTR_RW(Class, attr) { MRB_ATTR_R(Class, attr); MRB_ATTR_W(Class, attr); }

#define RB_ATTR_R(Klass, Attr, attr) _rb_define_method(klass, #attr, Klass##Get##Attr)
#define RB_ATTR_W(Klass, Attr, attr) _rb_define_method(klass, #attr "=", Klass##Set##Attr)
#define RB_ATTR_RW(Klass, Attr, attr) \
{ RB_ATTR_R(Klass, Attr, attr); RB_ATTR_W(Klass, Attr, attr); }

#define SET_FUN(Klass, param_type, param_t_s, last_param_def) \
RB_METHOD(Klass##Set) \
{ \
Klass *k = getPrivateData<Klass>(self); \
if (argc == 1) \
{ \
VALUE otherObj = argv[0]; \
Klass *other = getPrivateDataCheck<Klass>(otherObj, Klass##Type); \
*k = *other; \
} \
else \
{ \
param_type p1, p2, p3, p4 = last_param_def; \
rb_get_args(argc, argv, param_t_s, &p1, &p2, &p3, &p4 RB_ARG_END); \
k->set(p1, p2, p3, p4); \
} \
return self; \
}

#define SET_FUN_2(Klass, param_type, param_t_s, last_param_def) \
RB_METHOD(Klass##Set) \
{ \
Klass *k = getPrivateData<Klass>(self); \
if (argc == 1) \
{ \
VALUE otherObj = argv[0]; \
Klass *other = getPrivateDataCheck<Klass>(otherObj, Klass##Type); \
*k = *other; \
} \
else \
{ \
param_type p1, p2 = last_param_def; \
rb_get_args(argc, argv, param_t_s, &p1, &p2 RB_ARG_END); \
k->set(p1, p2); \
} \
return self; \
}

#define INIT_FUN(Klass, param_type, param_t_s, last_param_def) \
RB_METHOD(Klass##Initialize) \
{ \
Klass *k; \
if (argc == 0) \
{ \
k = new Klass(); \
} \
else \
{ \
param_type p1, p2, p3, p4 = last_param_def; \
rb_get_args(argc, argv, param_t_s, &p1, &p2, &p3, &p4 RB_ARG_END); \
k = new Klass(p1, p2, p3, p4); \
} \
setPrivateData(self, k); \
return self; \
}

#define INIT_FUN_2(Klass, param_type, param_t_s, last_param_def) \
RB_METHOD(Klass##Initialize) \
{ \
Klass *k; \
if (argc == 0) \
{ \
k = new Klass(); \
} \
else \
{ \
param_type p1, p2 = last_param_def; \
rb_get_args(argc, argv, param_t_s, &p1, &p2 RB_ARG_END); \
k = new Klass(p1, p2); \
} \
setPrivateData(self, k); \
return self; \
}

#define EQUAL_FUN(Klass) \
RB_METHOD(Klass##Equal) \
{ \
Klass *p = getPrivateData<Klass>(self); \
VALUE otherObj; \
Klass *other; \
rb_get_args(argc, argv, "o", &otherObj RB_ARG_END); \
if (rgssVer >= 3) \
if (!rb_typeddata_is_kind_of(otherObj, &Klass##Type)) \
return Qfalse; \
other = getPrivateDataCheck<Klass>(otherObj, Klass##Type); \
return rb_bool_new(*p == *other); \
}

#define ATTR_RW(Klass, Attr, arg_type, arg_t_s, value_fun) \
RB_METHOD(Klass##Get##Attr) \
{ \
RB_UNUSED_PARAM \
Klass *p = getPrivateData<Klass>(self); \
return value_fun(p->get##Attr()); \
} \
RB_METHOD(Klass##Set##Attr) \
{ \
Klass *p = getPrivateData<Klass>(self); \
arg_type arg; \
rb_get_args(argc, argv, arg_t_s, &arg RB_ARG_END); \
p->set##Attr(arg); \
return *argv; \
}

#define ATTR_DOUBLE_RW(Klass, Attr) ATTR_RW(Klass, Attr, double, "f", rb_float_new)
#define ATTR_FLOAT_RW(Klass, Attr) ATTR_RW(Klass, Attr, float, "f", rb_float_new)
#define ATTR_INT_RW(Klass, Attr) ATTR_RW(Klass, Attr, int, "i", rb_fix_new)

#endif
Loading