mirror of https://github.com/bjornbytes/lovr.git
lovr.graphics.plane;
This commit is contained in:
parent
a2c51e17ab
commit
8ac95f4038
|
@ -305,6 +305,50 @@ void lovrGraphicsLine(float* points, int count) {
|
||||||
lovrGraphicsDrawShape(GL_LINE_STRIP);
|
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) {
|
void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ) {
|
||||||
float points[] = {
|
float points[] = {
|
||||||
// Front
|
// Front
|
||||||
|
|
|
@ -89,6 +89,7 @@ void lovrGraphicsGetDimensions(int* width, int* height);
|
||||||
void lovrGraphicsSetShapeData(float* data, int count, unsigned int* indices, int indexCount);
|
void lovrGraphicsSetShapeData(float* data, int count, unsigned int* indices, int indexCount);
|
||||||
void lovrGraphicsDrawShape();
|
void lovrGraphicsDrawShape();
|
||||||
void lovrGraphicsLine(float* points, int count);
|
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);
|
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);
|
Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage);
|
||||||
Model* lovrGraphicsNewModel(const char* path);
|
Model* lovrGraphicsNewModel(const char* path);
|
||||||
|
|
|
@ -33,6 +33,7 @@ const luaL_Reg lovrGraphics[] = {
|
||||||
{ "rotate", l_lovrGraphicsRotate },
|
{ "rotate", l_lovrGraphicsRotate },
|
||||||
{ "scale", l_lovrGraphicsScale },
|
{ "scale", l_lovrGraphicsScale },
|
||||||
{ "line", l_lovrGraphicsLine },
|
{ "line", l_lovrGraphicsLine },
|
||||||
|
{ "plane", l_lovrGraphicsPlane },
|
||||||
{ "cube", l_lovrGraphicsCube },
|
{ "cube", l_lovrGraphicsCube },
|
||||||
{ "getWidth", l_lovrGraphicsGetWidth },
|
{ "getWidth", l_lovrGraphicsGetWidth },
|
||||||
{ "getHeight", l_lovrGraphicsGetHeight },
|
{ "getHeight", l_lovrGraphicsGetHeight },
|
||||||
|
@ -342,6 +343,24 @@ int l_lovrGraphicsLine(lua_State* L) {
|
||||||
return 0;
|
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) {
|
int l_lovrGraphicsCube(lua_State* L) {
|
||||||
const char* userDrawMode = luaL_checkstring(L, 1);
|
const char* userDrawMode = luaL_checkstring(L, 1);
|
||||||
DrawMode* drawMode = (DrawMode*) map_get(&DrawModes, userDrawMode);
|
DrawMode* drawMode = (DrawMode*) map_get(&DrawModes, userDrawMode);
|
||||||
|
|
|
@ -37,6 +37,7 @@ int l_lovrGraphicsTranslate(lua_State* L);
|
||||||
int l_lovrGraphicsRotate(lua_State* L);
|
int l_lovrGraphicsRotate(lua_State* L);
|
||||||
int l_lovrGraphicsScale(lua_State* L);
|
int l_lovrGraphicsScale(lua_State* L);
|
||||||
int l_lovrGraphicsLine(lua_State* L);
|
int l_lovrGraphicsLine(lua_State* L);
|
||||||
|
int l_lovrGraphicsPlane(lua_State* L);
|
||||||
int l_lovrGraphicsCube(lua_State* L);
|
int l_lovrGraphicsCube(lua_State* L);
|
||||||
int l_lovrGraphicsGetWidth(lua_State* L);
|
int l_lovrGraphicsGetWidth(lua_State* L);
|
||||||
int l_lovrGraphicsGetHeight(lua_State* L);
|
int l_lovrGraphicsGetHeight(lua_State* L);
|
||||||
|
|
Loading…
Reference in New Issue