LuaYard/Renderer.cpp

202 lines
4.9 KiB
C++

#include "Renderer.h"
#include "Texture.h"
#include "Window.h"
#include "SDL2/include/SDL_image.h"
#include "LuaHelper.h"
#include <iostream>
using namespace std;
inline int Renderer::close(lua_State* L)
{
cout << "In Renderer::close" << endl;
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
p->~Renderer();
return 0;
}
Renderer::Renderer(SDL_Renderer* r) : rnd(r, SDL_DestroyRenderer)
{
}
inline int Renderer::update(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
SDL_RenderPresent(p->rnd.get());
return 0;
}
inline int Renderer::clear(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
SDL_RenderClear(p->rnd.get());
return 0;
}
inline int Renderer::setColor(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
luaL_checktype(L, 2, LUA_TTABLE);
SDL_Color c;
if (LuaColorToColor(L, 2, c))
{
luaL_error(L, "bad argument #2 to setColor. rgba expected, got %s", lua_tostring(L, -1));
}
SDL_SetRenderDrawColor(p->rnd.get(), c.r, c.g, c.b, c.a);
return 0;
}
inline int Renderer::getColor(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
Uint8 r, b, g, a;
SDL_GetRenderDrawColor(p->rnd.get(), &r, &g, &b, &a);
lua_newtable(L);
lua_pushinteger(L, r);
lua_setfield(L, -2, "r");
lua_pushinteger(L, g);
lua_setfield(L, -2, "g");
lua_pushinteger(L, b);
lua_setfield(L, -2, "b");
lua_pushinteger(L, a);
lua_setfield(L, -2, "a");
lua_pushstring(L, "rgba");
lua_setfield(L, -2, "type");
return 1;
}
inline int Renderer::drawRect(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
luaL_checktype(L, 2, LUA_TTABLE);
SDL_Rect r;
if (LuaRectToRect(L, 2, r))
{
luaL_error(L, "bad argument #2 to drawRect. rect expected, got %s", lua_tostring(L, -1));
}
SDL_RenderDrawRect(p->rnd.get(), &r);
return 0;
}
inline int Renderer::fillRect(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
luaL_checktype(L, 2, LUA_TTABLE);
SDL_Rect r;
if (LuaRectToRect(L, 2, r))
{
luaL_error(L, "bad argument #2 to drawRect. rect expected, got %s", lua_tostring(L, -1));
}
SDL_RenderFillRect(p->rnd.get(), &r);
return 0;
}
inline int Renderer::loadTexture(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
auto filepath = luaL_checkstring(L, 2);
SDL_Texture* text = IMG_LoadTexture(p->rnd.get(), filepath);
Texture::create(L, p->rnd, text);
return 1;
}
inline int Renderer::copy(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
auto t = (Texture*)luaL_checkudata(L, 2, "texture");
luaL_checktype(L, 3, LUA_TTABLE);
luaL_checktype(L, 4, LUA_TTABLE);
SDL_Rect src;
if (LuaRectToRect(L, 3, src))
{
luaL_error(L, "bad argument #3 to copy. rect expected, got %s", lua_tostring(L, -1));
}
SDL_Rect dst;
if (LuaRectToRect(L, 4, dst))
{
luaL_error(L, "bad argument #4 to copy. rect expected, got %s", lua_tostring(L, -1));
}
SDL_RenderCopy(p->rnd.get(), t->text.get(), &src, &dst);
return 0;
}
inline int Renderer::copyTo(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
auto t = (Texture*)luaL_checkudata(L, 2, "texture");
luaL_checktype(L, 3, LUA_TTABLE);
SDL_Rect dst;
if (LuaRectPointToRect(L, 3, dst, t->w, t->h))
{
luaL_error(L, "bad argument #4 to copy. rect/point expected, got %s", lua_tostring(L, -1));
}
SDL_RenderCopy(p->rnd.get(), t->text.get(), NULL, &dst);
return 0;
}
inline int Renderer::copyFill(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
auto t = (Texture*)luaL_checkudata(L, 2, "texture");
luaL_checktype(L, 3, LUA_TTABLE);
SDL_Rect src;
if (LuaRectToRect(L, 3, src))
{
luaL_error(L, "bad argument #4 to copy. rect/point expected, got %s", lua_tostring(L, -1));
}
SDL_RenderCopy(p->rnd.get(), t->text.get(), &src, NULL);
return 0;
}
inline int Renderer::copyFullFill(lua_State* L)
{
auto p = (Renderer*)luaL_checkudata(L, 1, "renderer");
auto t = (Texture*)luaL_checkudata(L, 2, "texture");
SDL_RenderCopy(p->rnd.get(), t->text.get(), NULL, NULL);
return 0;
}
int Renderer::create(lua_State* L)
{
cout << "In Renderer::create" << endl;
auto w = (Window*)luaL_checkudata(L, 1, "window");
auto p = new (lua_newuserdata(L, sizeof(Renderer))) Renderer(SDL_CreateRenderer(w->wnd.get(), -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE));
if (luaL_newmetatable(L, "renderer"))
{
// Type
lua_pushstring(L, "renderer");
lua_setfield(L, -2, "type");
// GC
lua_pushcfunction(L, close);
lua_setfield(L, -2, "__gc");
// Fields
lua_newtable(L);
setfn(close, "close");
setfn(update, "update");
setfn(clear, "clear");
setfn(setColor, "setColor");
setfn(getColor, "getColor");
setfn(drawRect, "drawRect");
setfn(fillRect, "fillRect");
setfn(loadTexture, "loadTexture");
setfn(copy, "copy");
setfn(copyTo, "copyTo");
setfn(copyFill, "copyFill");
setfn(copyFullFill, "copyFullFill");
lua_setfield(L, -2, "__index");
}
lua_setmetatable(L, -2);
return 1;
}