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);
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue