lovr.graphics.plane;

This commit is contained in:
bjorn 2016-10-03 20:56:45 -07:00
parent a2c51e17ab
commit 8ac95f4038
4 changed files with 65 additions and 0 deletions

View File

@ -305,6 +305,50 @@ void lovrGraphicsLine(float* points, int count) {
lovrGraphicsDrawShape(GL_LINE_STRIP);
}
void lovrGraphicsPlane(DrawMode mode, float x, float y, float z, float size, float nx, float ny, float nz) {
float points[] = {
-.5, .5, 0,
.5, .5, 0,
.5, -.5, 0,
-.5, -.5, 0
};
// Normalize the normal vector
float len = sqrt(nx * nx + ny * ny + nz + nz);
if (len != 1) {
len = 1 / len;
nx *= len;
ny *= len;
nz *= len;
}
// Vector perpendicular to the normal vector and the vector of the default geometry (cross product)
float cx = -ny;
float cy = nx;
float cz = 0.f;
// Angle between normal vector and the normal vector of the default geometry (dot product)
float theta = acos(nz);
float transform[16];
mat4_setTranslation(transform, x, y, z);
mat4_scale(transform, size, size, size);
mat4_rotate(transform, theta, cx, cy, cz);
lovrGraphicsPush();
lovrGraphicsTransform(transform);
if (mode == DRAW_MODE_LINE) {
lovrGraphicsSetShapeData(points, 12, NULL, 0);
lovrGraphicsDrawShape(GL_LINE_LOOP);
} else if (mode == DRAW_MODE_FILL) {
unsigned int indices[] = { 0, 3, 1, 2 };
lovrGraphicsSetShapeData(points, 12, indices, 4);
lovrGraphicsDrawShape(GL_TRIANGLE_STRIP);
}
lovrGraphicsPop();
}
void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ) {
float points[] = {
// Front

View File

@ -89,6 +89,7 @@ void lovrGraphicsGetDimensions(int* width, int* height);
void lovrGraphicsSetShapeData(float* data, int count, unsigned int* indices, int indexCount);
void lovrGraphicsDrawShape();
void lovrGraphicsLine(float* points, int count);
void lovrGraphicsPlane(DrawMode mode, float x, float y, float z, float size, float nx, float ny, float nz);
void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ);
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage);
Model* lovrGraphicsNewModel(const char* path);

View File

@ -33,6 +33,7 @@ const luaL_Reg lovrGraphics[] = {
{ "rotate", l_lovrGraphicsRotate },
{ "scale", l_lovrGraphicsScale },
{ "line", l_lovrGraphicsLine },
{ "plane", l_lovrGraphicsPlane },
{ "cube", l_lovrGraphicsCube },
{ "getWidth", l_lovrGraphicsGetWidth },
{ "getHeight", l_lovrGraphicsGetHeight },
@ -342,6 +343,24 @@ int l_lovrGraphicsLine(lua_State* L) {
return 0;
}
int l_lovrGraphicsPlane(lua_State* L) {
const char* userDrawMode = luaL_checkstring(L, 1);
DrawMode* drawMode = (DrawMode*) map_get(&DrawModes, userDrawMode);
if (!drawMode) {
return luaL_error(L, "Invalid draw mode: '%s'", userDrawMode);
}
float x = luaL_optnumber(L, 2, 0.f);
float y = luaL_optnumber(L, 3, 0.f);
float z = luaL_optnumber(L, 4, 0.f);
float s = luaL_optnumber(L, 5, 1.f);
float nx = luaL_optnumber(L, 6, 0.f);
float ny = luaL_optnumber(L, 7, 1.f);
float nz = luaL_optnumber(L, 8, 0.f);
lovrGraphicsPlane(*drawMode, x, y, z, s, nx, ny, nz);
return 0;
}
int l_lovrGraphicsCube(lua_State* L) {
const char* userDrawMode = luaL_checkstring(L, 1);
DrawMode* drawMode = (DrawMode*) map_get(&DrawModes, userDrawMode);

View File

@ -37,6 +37,7 @@ int l_lovrGraphicsTranslate(lua_State* L);
int l_lovrGraphicsRotate(lua_State* L);
int l_lovrGraphicsScale(lua_State* L);
int l_lovrGraphicsLine(lua_State* L);
int l_lovrGraphicsPlane(lua_State* L);
int l_lovrGraphicsCube(lua_State* L);
int l_lovrGraphicsGetWidth(lua_State* L);
int l_lovrGraphicsGetHeight(lua_State* L);