diff options
Diffstat (limited to 'Runtime/Scripting')
-rw-r--r-- | Runtime/Scripting/Rendering/ImageData.bind.cpp | 38 | ||||
-rw-r--r-- | Runtime/Scripting/Rendering/Rendering.bind.cpp | 32 | ||||
-rw-r--r-- | Runtime/Scripting/Rendering/Texture.bind.cpp | 143 |
3 files changed, 213 insertions, 0 deletions
diff --git a/Runtime/Scripting/Rendering/ImageData.bind.cpp b/Runtime/Scripting/Rendering/ImageData.bind.cpp new file mode 100644 index 0000000..88412e5 --- /dev/null +++ b/Runtime/Scripting/Rendering/ImageData.bind.cpp @@ -0,0 +1,38 @@ +#include "Runtime/Graphics/ImageData.h"
+
+using namespace LuaBind;
+
+LUA_BIND_REGISTRY(ImageData) +{ + LUA_BIND_REGISTER_METHODS(state, + { "GetWidth", _GetWidth }, + { "GetHeight", _GetHeight }, + { "GetSize", _GetSize } + ); +} + +LUA_BIND_POSTPROCESS(ImageData) +{ +} + +LUA_BIND_IMPL_METHOD(ImageData, _GetWidth)
+{
+ LUA_BIND_PREPARE(L, ImageData);
+ state.Push(self->width);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(ImageData, _GetHeight)
+{
+ LUA_BIND_PREPARE(L, ImageData);
+ state.Push(self->height);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(ImageData, _GetSize)
+{
+ LUA_BIND_PREPARE(L, ImageData);
+ state.Push(self->width);
+ state.Push(self->height);
+ return 2;
+}
diff --git a/Runtime/Scripting/Rendering/Rendering.bind.cpp b/Runtime/Scripting/Rendering/Rendering.bind.cpp index 29fa421..40b3ac5 100644 --- a/Runtime/Scripting/Rendering/Rendering.bind.cpp +++ b/Runtime/Scripting/Rendering/Rendering.bind.cpp @@ -1,4 +1,32 @@ #include "Runtime/Graphics/Shader.h" +#include "Runtime/Graphics/Texture.h" +#include "Runtime/Graphics/ImageData.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "ThirdParty/stb/stb_image.h" + +// imgData = Rendering.LoadImage(path) +int LoadImage(lua_State* L) +{ + LUA_BIND_STATE(L); + + const char* path = state.GetValue<const char*>(1, ""); + + stbi_set_flip_vertically_on_load(true); + ImageData* data = new ImageData(state.GetVM()); + int channels; + data->pixels = stbi_load(path, &data->width, &data->height, &channels, 0);
+ data->format = ImageData::EPixelFormat::RGB; + data->type = ImageData::EPixelElementType::UNSIGNED_BYTE; + + data->PushUserdata(state); + return 1; +} + +static luaL_Reg funcs[] = { + {"LoadImage", LoadImage}, + {0, 0} +}; int luaopen_GameLab_Engine_Rendering(lua_State* L) { @@ -11,7 +39,11 @@ int luaopen_GameLab_Engine_Rendering(lua_State* L) state.PushNamespace("Engine"); state.PushNamespace("Rendering"); + state.RegisterMethods(funcs); + state.RegisterNativeClass<Shader>(); + state.RegisterNativeClass<ImageData>(); + state.RegisterNativeClass<Texture>(); return 1; }
\ No newline at end of file diff --git a/Runtime/Scripting/Rendering/Texture.bind.cpp b/Runtime/Scripting/Rendering/Texture.bind.cpp new file mode 100644 index 0000000..061a303 --- /dev/null +++ b/Runtime/Scripting/Rendering/Texture.bind.cpp @@ -0,0 +1,143 @@ +#include "Runtime/Graphics/Texture.h"
+
+using namespace LuaBind;
+
+LUA_BIND_REGISTRY(Texture) +{ + LUA_BIND_REGISTER_METHODS(state, + { "New", _New }, + { "GetWidth", _GetWidth }, + { "GetHeight", _GetHeight }, + { "GetSize", _GetSize }, + { "GetType", _GetType }, + { "GetFormat", _GetFormat }, + { "GetWrapMode", _GetWrapMode }, + { "GetImageData", _GetImageData }, + { "IsKeepImageData", _IsKeepImageData }, + { "GetFilterMode", _GetFilterMode } + ); +} + +LUA_BIND_POSTPROCESS(Texture) +{
+ LUA_BIND_REGISTER_ENUM(state, "ETextureType",
+ { "TEX_2D", ETextureType::TEX_2D },
+ { "TEX_CUBE", ETextureType::TEX_CUBE }
+ );
+ LUA_BIND_REGISTER_ENUM(state, "ETextureFormat",
+ { "RGBA32", ETextureFormat::RGBA32 },
+ { "RGB24", ETextureFormat::RGB24 },
+ { "RGB16", ETextureFormat::RGB16 },
+ { "R8", ETextureFormat::R8 },
+ { "A8", ETextureFormat::A8 }
+ );
+ LUA_BIND_REGISTER_ENUM(state, "ETextureWrapMode",
+ { "Clamp", ETextureWrapMode::Clamp },
+ { "Repeat", ETextureWrapMode::Repeat },
+ { "Mirror", ETextureWrapMode::Mirror }
+ );
+ LUA_BIND_REGISTER_ENUM(state, "ETextureFilterMode",
+ { "Nearest", ETextureFilterMode::Nearest },
+ { "Linear", ETextureFilterMode::Linear }
+ );
+}
+
+// Texture.New(imgData, keepImgData, type, format, wrapMode, filterMode)
+LUA_BIND_IMPL_METHOD(Texture, _New)
+{
+ LUA_BIND_STATE(L);
+ LUA_BIND_CHECK(L, "U");
+
+ ImageData* imgData = state.GetUserdata<ImageData>(1);
+
+ TextureSetting setting;
+ setting.keepImageData = state.GetValue(2, false);
+ setting.type = state.GetValue<int>(3, (int)ETextureType::TEX_2D);
+ setting.format = state.GetValue(4, (int)ETextureFormat::RGBA32);
+ setting.wrapMode = state.GetValue(5, (int)ETextureWrapMode::Clamp);
+ setting.filterMode = state.GetValue(6, (int)ETextureFilterMode::Linear);
+
+ try
+ {
+ Texture* tex = new Texture(state.GetVM(), setting, imgData);
+ tex->PushUserdata(state);
+ return 1;
+ }
+ catch (TextureException e)
+ {
+ luaL_error(L, "Failed to create texture.");
+ return 0;
+ }
+ return 0;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetWidth)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_Width);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetHeight)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_Height);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetSize)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_Width);
+ state.Push(self->m_Height);
+ return 2;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetType)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_Type);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetFormat)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_Format);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetWrapMode)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_WrapMode);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetFilterMode)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_FilterMode);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _IsKeepImageData)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ state.Push(self->m_KeepPixelData);
+ return 1;
+}
+
+LUA_BIND_IMPL_METHOD(Texture, _GetImageData)
+{
+ LUA_BIND_PREPARE(L, Texture);
+ if (self->m_KeepPixelData)
+ {
+ self->PushMemberRef(state, self->m_ImageData);
+ }
+ else
+ {
+ state.PushNil();
+ }
+ return 1;
+}
|