202 lines
4.9 KiB
C++
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;
|
|
}
|