Many API additions 2
This commit is contained in:
parent
3c780c7290
commit
0629b042ad
99
src/luaapi.c
99
src/luaapi.c
@ -15,6 +15,8 @@
|
|||||||
#include"k3menu.h"
|
#include"k3menu.h"
|
||||||
#include<assert.h>
|
#include<assert.h>
|
||||||
#include"net_hi.h"
|
#include"net_hi.h"
|
||||||
|
#include"k3particles.h"
|
||||||
|
#include<GLFW/glfw3.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is by far the least clean or well-maintained source in the
|
* This is by far the least clean or well-maintained source in the
|
||||||
@ -170,6 +172,24 @@ error:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct mixitem {
|
||||||
|
void *thing;
|
||||||
|
#define MIXITEM_SOURCE 0
|
||||||
|
#define MIXITEM_SOUND 1
|
||||||
|
#define MIXITEM_QUEUE 2
|
||||||
|
#define MIXITEM_POWER 3
|
||||||
|
int type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Animator {
|
||||||
|
struct k3Mdl *mdl;
|
||||||
|
struct k3Animator animator;
|
||||||
|
struct k3AnimationBone *bones;
|
||||||
|
|
||||||
|
bool playing;
|
||||||
|
double playStartTime;
|
||||||
|
};
|
||||||
|
|
||||||
static int game_addentity(lua_State *L) {
|
static int game_addentity(lua_State *L) {
|
||||||
lua_Integer li;
|
lua_Integer li;
|
||||||
int i;
|
int i;
|
||||||
@ -666,15 +686,6 @@ static int game_water_disturb(lua_State *L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mixitem {
|
|
||||||
void *thing;
|
|
||||||
#define MIXITEM_SOURCE 0
|
|
||||||
#define MIXITEM_SOUND 1
|
|
||||||
#define MIXITEM_QUEUE 2
|
|
||||||
#define MIXITEM_POWER 3
|
|
||||||
int type;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int dagame_mixsound(lua_State *L) {
|
static int dagame_mixsound(lua_State *L) {
|
||||||
struct mixitem *i = lua_touserdata(L, 1);
|
struct mixitem *i = lua_touserdata(L, 1);
|
||||||
|
|
||||||
@ -866,13 +877,15 @@ static int game_ref(lua_State *L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int game_batch(lua_State *L) {
|
static int game_batch(lua_State *L) {
|
||||||
void **r = lua_touserdata(L, 1);
|
void *r = lua_touserdata(L, 1);
|
||||||
|
|
||||||
struct k3Mdl *mdl;
|
struct k3Mdl *mdl;
|
||||||
if(luaL_testudata(L, 1, "k3water")) {
|
if(luaL_testudata(L, 1, "k3water")) {
|
||||||
mdl = ((struct k3Water*) *r)->mdl;
|
mdl = (*(struct k3Water**) r)->mdl;
|
||||||
|
} else if(luaL_testudata(L, 1, "k3cpuparticles")) {
|
||||||
|
mdl = (*(struct k3CPUQuadParticles**) r)->mdl;
|
||||||
} else if(luaL_testudata(L, 1, "k3mdl")) {
|
} else if(luaL_testudata(L, 1, "k3mdl")) {
|
||||||
mdl = *r;
|
mdl = *(struct k3Mdl**) r;
|
||||||
} else return 0;
|
} else return 0;
|
||||||
|
|
||||||
lua_rawgeti(L, 2, 1);
|
lua_rawgeti(L, 2, 1);
|
||||||
@ -884,7 +897,28 @@ static int game_batch(lua_State *L) {
|
|||||||
|
|
||||||
lua_pop(L, 3);
|
lua_pop(L, 3);
|
||||||
|
|
||||||
if(lua_gettop(L) == 3) {
|
struct k3AnimationBone *bones = NULL;
|
||||||
|
|
||||||
|
if(lua_gettop(L) >= 4) {
|
||||||
|
struct Animator *anim = lua_touserdata(L, 4);
|
||||||
|
|
||||||
|
if(anim->playing) {
|
||||||
|
k3AnimatorSet(&anim->animator, glfwGetTime() - anim->playStartTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
bones = anim->bones;
|
||||||
|
|
||||||
|
size_t boneCount = k3MdlGetBoneCount(anim->mdl);
|
||||||
|
|
||||||
|
for(size_t m = 0; m < boneCount; m++) {
|
||||||
|
vec3 scaleignore;
|
||||||
|
mat4 rot;
|
||||||
|
glm_decompose(anim->animator.inter[m], bones[m].translation, rot, scaleignore);
|
||||||
|
glm_mat4_quat(anim->animator.inter[m], bones[m].rotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lua_gettop(L) >= 3) {
|
||||||
mat4 anchor;
|
mat4 anchor;
|
||||||
for(int i = 0; i < 16; i++) {
|
for(int i = 0; i < 16; i++) {
|
||||||
lua_rawgeti(L, 3, i + 1);
|
lua_rawgeti(L, 3, i + 1);
|
||||||
@ -895,7 +929,7 @@ static int game_batch(lua_State *L) {
|
|||||||
glm_mat4_mul(anchor, m, m);
|
glm_mat4_mul(anchor, m, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
k3Batch(mdl, m, NULL);
|
k3Batch(mdl, m, bones);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -986,6 +1020,22 @@ static int game_submissive_send(lua_State *L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dagame_cphysics_add_force(lua_State *L) {
|
||||||
|
struct CPhysics *c = *(struct CPhysics**) lua_touserdata(L, 1);
|
||||||
|
|
||||||
|
dBodyID bid = dGeomGetBody(c->geom);
|
||||||
|
|
||||||
|
if(!bid) {
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dBodyAddForce(bid, lua_tonumber(L, 2), lua_tonumber(L, 3), lua_tonumber(L, 4));
|
||||||
|
|
||||||
|
lua_pushboolean(L, true);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int game_cphysics_get(lua_State *L) {
|
static int game_cphysics_get(lua_State *L) {
|
||||||
struct CPhysics *c = *(struct CPhysics**) lua_touserdata(L, 1);
|
struct CPhysics *c = *(struct CPhysics**) lua_touserdata(L, 1);
|
||||||
|
|
||||||
@ -1052,7 +1102,7 @@ static int game_cphysics_get(lua_State *L) {
|
|||||||
lua_pushnumber(L, c->speed);
|
lua_pushnumber(L, c->speed);
|
||||||
return 1;
|
return 1;
|
||||||
} else if(!strcmp(k, "add_force")) {
|
} else if(!strcmp(k, "add_force")) {
|
||||||
//lua_pushcfunction(L, );
|
lua_pushcfunction(L, dagame_cphysics_add_force);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1083,7 +1133,9 @@ static int game_cphysics_set(lua_State *L) {
|
|||||||
lua_rawgeti(L, 3, 3);
|
lua_rawgeti(L, 3, 3);
|
||||||
lua_rawgeti(L, 3, 4);
|
lua_rawgeti(L, 3, 4);
|
||||||
|
|
||||||
dGeomSetQuaternion(c->geom, (dQuaternion) {lua_tonumber(L, -1), lua_tonumber(L, -4), lua_tonumber(L, -3), lua_tonumber(L, -2)});
|
dQuaternion q = {lua_tonumber(L, -1), lua_tonumber(L, -4), lua_tonumber(L, -3), lua_tonumber(L, -2)};
|
||||||
|
|
||||||
|
dGeomSetQuaternion(c->geom, q);
|
||||||
|
|
||||||
lua_pop(L, 4);
|
lua_pop(L, 4);
|
||||||
} else if(!strcmp(k, "vel")) {
|
} else if(!strcmp(k, "vel")) {
|
||||||
@ -1280,7 +1332,11 @@ static int game_get(lua_State *L) {
|
|||||||
} else if(!strcmp(i, "authority")) {
|
} else if(!strcmp(i, "authority")) {
|
||||||
lua_pushboolean(L, Game.isAuthority);
|
lua_pushboolean(L, Game.isAuthority);
|
||||||
} else if(!strcmp(i, "spectated")) {
|
} else if(!strcmp(i, "spectated")) {
|
||||||
|
if(Game.spectated == ENT_ID_INVALID) {
|
||||||
|
lua_pushnil(L);
|
||||||
|
} else {
|
||||||
lua_pushinteger(L, Game.spectated);
|
lua_pushinteger(L, Game.spectated);
|
||||||
|
}
|
||||||
} else if(!strcmp(i, "fov")) {
|
} else if(!strcmp(i, "fov")) {
|
||||||
lua_pushnumber(L, LuaapiFov);
|
lua_pushnumber(L, LuaapiFov);
|
||||||
} else if(!strcmp(i, "rate")) {
|
} else if(!strcmp(i, "rate")) {
|
||||||
@ -1491,7 +1547,6 @@ static int game_load(lua_State *L) {
|
|||||||
|
|
||||||
static int dagame_cleanup(lua_State *L) {
|
static int dagame_cleanup(lua_State *L) {
|
||||||
luaapi_cleanup();
|
luaapi_cleanup();
|
||||||
LuaapiCamFocus = false;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1597,7 +1652,7 @@ static int dagame_mdl(lua_State *L) {
|
|||||||
vertexCount = lua_tointeger(L, -1) / 3;
|
vertexCount = lua_tointeger(L, -1) / 3;
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
positions = malloc(sizeof(*positions) * vertexCount);
|
positions = calloc(vertexCount, sizeof(*positions));
|
||||||
|
|
||||||
for(size_t i = 0; i < vertexCount; i++) {
|
for(size_t i = 0; i < vertexCount; i++) {
|
||||||
lua_geti(L, -1, i * 3 + 1);
|
lua_geti(L, -1, i * 3 + 1);
|
||||||
@ -1615,7 +1670,7 @@ static int dagame_mdl(lua_State *L) {
|
|||||||
indexCount = lua_tointeger(L, -1);
|
indexCount = lua_tointeger(L, -1);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
indices = malloc(sizeof(*indices) * indexCount);
|
indices = calloc(indexCount, sizeof(*indices));
|
||||||
|
|
||||||
for(size_t i = 0; i < indexCount; i++) {
|
for(size_t i = 0; i < indexCount; i++) {
|
||||||
lua_geti(L, -1, i + 1);
|
lua_geti(L, -1, i + 1);
|
||||||
@ -1637,7 +1692,7 @@ static int dagame_mdl(lua_State *L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
normals = malloc(sizeof(*normals) * 3 * vertexCount);
|
normals = calloc(vertexCount, sizeof(*normals) * 3);
|
||||||
|
|
||||||
for(size_t i = 0; i < vertexCount; i++) {
|
for(size_t i = 0; i < vertexCount; i++) {
|
||||||
lua_geti(L, -1, i * 3 + 1);
|
lua_geti(L, -1, i * 3 + 1);
|
||||||
@ -1660,7 +1715,7 @@ static int dagame_mdl(lua_State *L) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uvs = malloc(sizeof(*uvs) * vertexCount);
|
uvs = calloc(vertexCount, sizeof(*uvs));
|
||||||
|
|
||||||
for(size_t i = 0; i < vertexCount; i++) {
|
for(size_t i = 0; i < vertexCount; i++) {
|
||||||
lua_geti(L, -1, i * 2 + 1);
|
lua_geti(L, -1, i * 2 + 1);
|
||||||
@ -1858,7 +1913,7 @@ static int dagame_draw(lua_State *L) {
|
|||||||
float b = lua_type(L, -2) == LUA_TNUMBER ? lua_tonumber(L, -2) : 1;
|
float b = lua_type(L, -2) == LUA_TNUMBER ? lua_tonumber(L, -2) : 1;
|
||||||
float a = lua_type(L, -1) == LUA_TNUMBER ? lua_tonumber(L, -1) : 1;
|
float a = lua_type(L, -1) == LUA_TNUMBER ? lua_tonumber(L, -1) : 1;
|
||||||
|
|
||||||
k3BatchAdd(tex, (struct k3RectF) {.x = sx, .y = sy, .w = sw, .h = sh}, (struct k3RectF) {.x = x, .y = y, .w = w, .h = h}, 0, (vec4) {r, g, b, a});
|
k3BatchAdd(tex, (struct k3RectF) {.x = sx, .y = sy, .w = sw, .h = sh}, (struct k3RectF) {.x = x, .y = y, .w = w, .h = h}, 0, (vec4) {r, g, b, a}, 0);
|
||||||
|
|
||||||
lua_pop(L, 13);
|
lua_pop(L, 13);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user