[ruamoko] Add builtins for adding lights to scenes

Pretty much just raw wrappers around the C versions. I'm not sure about
Light_EnableSun (even in C), but it does build the sky surf pvs.
This commit is contained in:
Bill Currie 2022-05-05 23:43:39 +09:00
parent 95264b3a54
commit d14b17567e
3 changed files with 166 additions and 3 deletions

View file

@ -45,6 +45,7 @@
#include "QF/plugin/vid_render.h"
#include "QF/scene/entity.h"
#include "QF/scene/light.h"
#include "QF/scene/scene.h"
#include "QF/scene/transform.h"
@ -56,10 +57,18 @@ typedef struct rua_scene_s {
scene_t *scene;
} rua_scene_t;
typedef struct rua_lighting_s {
struct rua_lighting_s *next;
struct rua_lighting_s **prev;
lightingdata_t *ldata;
} rua_lighting_t;
typedef struct rua_scene_resources_s {
progs_t *pr;
PR_RESMAP (rua_scene_t) scene_map;
PR_RESMAP (rua_lighting_t) lighting_map;
rua_scene_t *scenes;
rua_lighting_t *ldatas;
} rua_scene_resources_t;
static rua_scene_t *
@ -96,6 +105,12 @@ rua__scene_get (rua_scene_resources_t *res, pr_ulong_t id, const char *name)
}
#define rua_scene_get(res, id) rua__scene_get(res, id, __FUNCTION__)
static int __attribute__((pure))
rua_scene_index (rua_scene_resources_t *res, rua_scene_t *scene)
{
return PR_RESINDEX (res->scene_map, scene);
}
static entity_t * __attribute__((pure))
rua__entity_get (rua_scene_resources_t *res, pr_ulong_t id, const char *name)
{
@ -134,10 +149,44 @@ rua__transform_get (rua_scene_resources_t *res, pr_ulong_t id, const char *name)
}
#define rua_transform_get(res, id) rua__transform_get(res, id, __FUNCTION__)
static int __attribute__((pure))
rua_scene_index (rua_scene_resources_t *res, rua_scene_t *scene)
static rua_lighting_t *
rua_lighting_new (rua_scene_resources_t *res)
{
return PR_RESINDEX (res->scene_map, scene);
return PR_RESNEW (res->lighting_map);
}
static void
rua_lighting_free (rua_scene_resources_t *res, rua_lighting_t *ldata)
{
if (ldata->next) {
ldata->next->prev = ldata->prev;
}
*ldata->prev = ldata->next;
ldata->prev = 0;
PR_RESFREE (res->lighting_map, ldata);
}
static rua_lighting_t * __attribute__((pure))
rua__lighting_get (rua_scene_resources_t *res, pr_ulong_t id, const char *name)
{
rua_lighting_t *ldata = 0;
if (id <= 0xffffffffu) {
ldata = PR_RESGET (res->lighting_map, (pr_int_t) id);
}
// ldata->prev will be null if the handle is unallocated
if (!ldata || !ldata->prev) {
PR_RunError (res->pr, "invalid lighting passed to %s", name + 3);
}
return ldata;
}
#define rua_lighting_get(res, id) rua__lighting_get(res, id, __FUNCTION__)
static int __attribute__((pure))
rua_lighting_index (rua_scene_resources_t *res, rua_lighting_t *ldata)
{
return PR_RESINDEX (res->lighting_map, ldata);
}
#define MAKE_ID(id, sc_id) ((((pr_ulong_t) (id)) << 32) \
@ -213,6 +262,22 @@ bi_Scene_DestroyEntity (progs_t *pr, void *_res)
Scene_DestroyEntity (scene->scene, ent);
}
static void
bi_Scene_SetLighting (progs_t *pr, void *_res)
{
rua_scene_resources_t *res = _res;
pr_ulong_t scene_id = P_ULONG (pr, 0);
rua_scene_t *scene = rua_scene_get (res, scene_id);
pr_ulong_t ldata_id = P_ULONG (pr, 1);
rua_lighting_t *ldata = 0;
if (ldata_id) {
ldata = rua_lighting_get (res, ldata_id);
}
scene->scene->lights = ldata->ldata;
}
static void
bi_Entity_GetTransform (progs_t *pr, void *_res)
{
@ -453,6 +518,74 @@ bi_Transform_Up (progs_t *pr, void *_res)
R_PACKED (pr, pr_vec4_t) = Transform_Up (transform);
}
static void
bi_Light_CreateLightingData (progs_t *pr, void *_res)
{
rua_scene_resources_t *res = _res;
pr_ulong_t scene_id = P_ULONG (pr, 0);
rua_scene_t *scene = rua_scene_get (res, scene_id);
rua_lighting_t *ldata = rua_lighting_new (res);
ldata->ldata = Light_CreateLightingData (scene->scene);
ldata->next = res->ldatas;
if (res->ldatas) {
res->ldatas->prev = &ldata->next;
}
ldata->prev = &res->ldatas;
res->ldatas = ldata;
// ldata id in lower 32-bits for all handles
// upper 32-bits reserved
R_ULONG (pr) = MAKE_ID (0, rua_lighting_index (res, ldata));
}
static void
rua_delete_lighting (rua_scene_resources_t *res, rua_lighting_t *ldata)
{
Light_DestroyLightingData (ldata->ldata);
rua_lighting_free (res, ldata);
}
static void
bi_Light_DestroyLightingData (progs_t *pr, void *_res)
{
rua_scene_resources_t *res = _res;
rua_lighting_t *ldata = rua_lighting_get (res, P_ULONG (pr, 0));
rua_delete_lighting (res, ldata);
}
static void
bi_Light_ClearLights (progs_t *pr, void *_res)
{
rua_scene_resources_t *res = _res;
rua_lighting_t *ldata = rua_lighting_get (res, P_ULONG (pr, 0));
Light_ClearLights (ldata->ldata);
}
static void
bi_Light_AddLight (progs_t *pr, void *_res)
{
rua_scene_resources_t *res = _res;
rua_lighting_t *ldata = rua_lighting_get (res, P_ULONG (pr, 0));
light_t *light = &P_PACKED (pr, light_t, 1);
int style = P_INT (pr, 5);
Light_AddLight (ldata->ldata, light, style);
}
static void
bi_Light_EnableSun (progs_t *pr, void *_res)
{
rua_scene_resources_t *res = _res;
rua_lighting_t *ldata = rua_lighting_get (res, P_ULONG (pr, 0));
Light_EnableSun (ldata->ldata);
}
#define p(type) PR_PARAM(type)
#define P(a, s) { .size = (s), .alignment = BITOP_LOG2 (a), }
#define bi(x,np,params...) {#x, bi_##x, -1, np, {params}}
@ -461,6 +594,7 @@ static builtin_t builtins[] = {
bi(Scene_DeleteScene, 1, p(ulong)),
bi(Scene_CreateEntity, 1, p(ulong)),
bi(Scene_DestroyEntity, 1, p(ulong)),
bi(Scene_SetLighting , 2, p(ulong), p(ulong)),
bi(Entity_GetTransform, 1, p(ulong)),
bi(Entity_SetModel, 2, p(ulong), p(int)),
@ -496,6 +630,13 @@ static builtin_t builtins[] = {
bi(Transform_Right, 1, p(ulong)),
bi(Transform_Up, 1, p(ulong)),
bi(Light_CreateLightingData, 1, p(ulong)),
bi(Light_DestroyLightingData, 1, p(ulong)),
bi(Light_ClearLights, 1, p(ulong)),
bi(Light_AddLight, 5, p(ulong),// really, 3
p(vec4), p(vec4), p(vec4), p(vec4), p(int)),
bi(Light_EnableSun, 1, p(ulong)),
{0}
};

View file

@ -6,16 +6,25 @@ typedef struct {
vec4 col[4];
} mat4x4;
typedef struct light_s {
vec4 color;
vec4 position;
vec4 direction;
vec4 attenuation;
} light_t;
//FIXME need a handle type
typedef struct { long handle; } scene_t;
typedef struct { long handle; } entity_t;
typedef struct { long handle; } transform_t;
typedef struct { long handle; } lightingdata_t;
typedef struct { int handle; } model_t;
scene_t Scene_NewScene (void);
void Scene_DeleteScene (scene_t scene);
entity_t Scene_CreateEntity (scene_t scene);
void Scene_DestroyEntity (entity_t ent);
void Scene_SetLighting (scene_t scene, lightingdata_t ldata);
transform_t Entity_GetTransform (entity_t ent);
void Entity_SetModel (entity_t ent, model_t model);
@ -48,6 +57,12 @@ vec4 Transform_Forward (transform_t transform);
vec4 Transform_Right (transform_t transform);
vec4 Transform_Up (transform_t transform);
lightingdata_t Light_CreateLightingData (scene_t scene);
void Light_DestroyLightingData (lightingdata_t ldata);
void Light_ClearLights (lightingdata_t ldata);
void Light_AddLight (lightingdata_t ldata, light_t light);
void Light_EnableSun (lightingdata_t ldata);
model_t Model_Load (string path);
void Model_Unload (model_t model);

View file

@ -4,6 +4,7 @@ scene_t Scene_NewScene (void) = #0;
void Scene_DeleteScene (scene_t scene) = #0;
entity_t Scene_CreateEntity (scene_t scene) = #0;
void Scene_DestroyEntity (entity_t ent) = #0;
void Scene_SetLighting (scene_t scene, lightingdata_t ldata) = #0;
transform_t Entity_GetTransform (entity_t ent) = #0;
void Entity_SetModel (entity_t ent, model_t model) = #0;
@ -36,5 +37,11 @@ vec4 Transform_Forward (transform_t transform) = #0;
vec4 Transform_Right (transform_t transform) = #0;
vec4 Transform_Up (transform_t transform) = #0;
lightingdata_t Light_CreateLightingData (scene_t scene) = #0;
void Light_DestroyLightingData (lightingdata_t ldata) = #0;
void Light_ClearLights (lightingdata_t ldata) = #0;
void Light_AddLight (lightingdata_t ldata, light_t light) = #0;
void Light_EnableSun (lightingdata_t ldata) = #0;
model_t Model_Load (string path) = #0;
void Model_Unload (model_t model) = #0;