mirror of
https://github.com/nunuhara/xsystem4.git
synced 2026-09-22 23:18:01 +03:00
SealEngine: add light parameter storage and HLL bindings
SealEngine manages a 41-float light parameter set (serialized as .lit file) for tone mapping, hemisphere lighting, and light scattering. This adds the storage and HLL plumbing, without wiring values into shaders. - A DIRECTIONAL_LIGHT instance owns a parameter set, filled by loading a .lit file (RE_instance_load). - SealEngine.StoreInstanceLightParam() reflects that presets into the plugin's master buffer, which is used by the renderer. - SealEngine.LoadInstanceLightParam() copies the master back into an instance, and Reset()/Set()/Get() operate directly on the master.
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
|
||||
#define RE_NR_BACK_CGS 16
|
||||
#define RE_NR_INSTANCE_TARGETS 2
|
||||
#define RE_NR_LIGHT_PARAMS 41 // .lit parameter count
|
||||
|
||||
#include <cglm/types.h>
|
||||
|
||||
@@ -57,6 +58,29 @@ enum RE_fog_type {
|
||||
RE_FOG_LIGHT_SCATTERING = 2,
|
||||
};
|
||||
|
||||
// Indices into light_params. Vector entries name their first component.
|
||||
enum seal_light_param {
|
||||
SEAL_LP_TONEMAP_EXPOSURE_BIAS = 0,
|
||||
SEAL_LP_TONEMAP_WHITE_POINT = 1,
|
||||
SEAL_LP_TONEMAP_A = 2,
|
||||
SEAL_LP_TONEMAP_B = 3,
|
||||
SEAL_LP_TONEMAP_C = 4,
|
||||
SEAL_LP_TONEMAP_D = 5,
|
||||
SEAL_LP_TONEMAP_E = 6,
|
||||
SEAL_LP_TONEMAP_F = 7,
|
||||
SEAL_LP_HEMI_VEC = 8, // x,y,z
|
||||
SEAL_LP_HEMI_SKY_COLOR = 11, // r,g,b
|
||||
SEAL_LP_HEMI_MID_COLOR = 14, // r,g,b
|
||||
SEAL_LP_HEMI_GROUND_COLOR = 17, // r,g,b
|
||||
SEAL_LP_LS_BETA_R = 20,
|
||||
SEAL_LP_LS_BETA_M = 21,
|
||||
SEAL_LP_LS_G = 22,
|
||||
SEAL_LP_LS_DISTANCE = 23,
|
||||
SEAL_LP_LS_LIGHT_VEC = 24, // x,y,z
|
||||
SEAL_LP_LS_LIGHT_COLOR = 27, // r,g,b
|
||||
SEAL_LP_LS_SUN_COLOR = 30, // r,g,b
|
||||
};
|
||||
|
||||
enum RE_draw_type {
|
||||
RE_DRAW_TYPE_NORMAL = 0,
|
||||
RE_DRAW_TYPE_ADDITIVE = 1,
|
||||
@@ -158,6 +182,7 @@ struct RE_plugin {
|
||||
|
||||
// SealEngine
|
||||
int mag_speed;
|
||||
float light_params[RE_NR_LIGHT_PARAMS];
|
||||
};
|
||||
|
||||
struct RE_instance {
|
||||
@@ -197,6 +222,7 @@ struct RE_instance {
|
||||
// Lights
|
||||
vec3 vec;
|
||||
vec3 globe_diffuse;
|
||||
float *light_params;
|
||||
|
||||
// Private
|
||||
bool local_transform_needs_update;
|
||||
@@ -244,6 +270,7 @@ bool RE_instance_optimize_path_line(struct RE_instance *instance);
|
||||
bool RE_instance_calc_path_finder_intersect_eye_vec(struct RE_instance *instance, int mouse_x, int mouse_y, vec3 out);
|
||||
bool RE_plugin_transform_pos_to_view_pos(struct RE_plugin *plugin, float x, float y, float z, int *view_x, int *view_y);
|
||||
bool RE_plugin_get_camera_z_vector(struct RE_plugin *plugin, vec3 out);
|
||||
void RE_plugin_reset_light_param(struct RE_plugin *plugin);
|
||||
|
||||
int RE_motion_get_state(struct motion *motion);
|
||||
bool RE_motion_set_state(struct motion *motion, int state);
|
||||
|
||||
@@ -790,6 +790,9 @@ struct amt_material *amt_find_material(struct amt *amt, const char *name);
|
||||
void opr_load(uint8_t *data, size_t size, struct pol *pol);
|
||||
void txa_load(uint8_t *data, size_t size, struct mot *mot);
|
||||
|
||||
void lit_reset(float *out);
|
||||
bool lit_parse(uint8_t *data, size_t size, float *out);
|
||||
|
||||
// mpr.c
|
||||
|
||||
struct mpr_float_key { int frame; float v; };
|
||||
|
||||
@@ -687,3 +687,63 @@ void txa_load(uint8_t *data, size_t size, struct mot *mot)
|
||||
mot->nr_texture_indices = count;
|
||||
mot->texture_indices = indices;
|
||||
}
|
||||
|
||||
void lit_reset(float *out)
|
||||
{
|
||||
static const float lit_param_defaults[RE_NR_LIGHT_PARAMS] = {
|
||||
[SEAL_LP_TONEMAP_EXPOSURE_BIAS] = 1.0f,
|
||||
[SEAL_LP_TONEMAP_WHITE_POINT] = 1.0f,
|
||||
[SEAL_LP_TONEMAP_A] = 0.22f,
|
||||
[SEAL_LP_TONEMAP_B] = 0.30f,
|
||||
[SEAL_LP_TONEMAP_C] = 0.10f,
|
||||
[SEAL_LP_TONEMAP_D] = 0.20f,
|
||||
[SEAL_LP_TONEMAP_E] = 0.01f,
|
||||
[SEAL_LP_TONEMAP_F] = 0.30f,
|
||||
[SEAL_LP_HEMI_VEC + 0] = -1.0f,
|
||||
[SEAL_LP_HEMI_VEC + 1] = -1.0f,
|
||||
[SEAL_LP_HEMI_VEC + 2] = 1.0f,
|
||||
[SEAL_LP_HEMI_SKY_COLOR + 0] = 1.2f,
|
||||
[SEAL_LP_HEMI_SKY_COLOR + 1] = 1.2f,
|
||||
[SEAL_LP_HEMI_SKY_COLOR + 2] = 1.2f,
|
||||
[SEAL_LP_HEMI_MID_COLOR + 0] = 0.5f,
|
||||
[SEAL_LP_HEMI_MID_COLOR + 1] = 0.5f,
|
||||
[SEAL_LP_HEMI_MID_COLOR + 2] = 0.5f,
|
||||
[SEAL_LP_HEMI_GROUND_COLOR + 0] = 0.3f,
|
||||
[SEAL_LP_HEMI_GROUND_COLOR + 1] = 0.3f,
|
||||
[SEAL_LP_HEMI_GROUND_COLOR + 2] = 0.3f,
|
||||
[SEAL_LP_LS_BETA_R] = 0.25f,
|
||||
[SEAL_LP_LS_BETA_M] = 1.25f,
|
||||
[SEAL_LP_LS_G] = 0.05f,
|
||||
[SEAL_LP_LS_DISTANCE] = 140.0f,
|
||||
[SEAL_LP_LS_LIGHT_VEC + 0] = -1.0f,
|
||||
[SEAL_LP_LS_LIGHT_VEC + 1] = -1.0f,
|
||||
[SEAL_LP_LS_LIGHT_VEC + 2] = 1.0f,
|
||||
[SEAL_LP_LS_LIGHT_COLOR + 0] = 1.0f,
|
||||
[SEAL_LP_LS_LIGHT_COLOR + 1] = 1.0f,
|
||||
[SEAL_LP_LS_LIGHT_COLOR + 2] = 1.0f,
|
||||
[SEAL_LP_LS_SUN_COLOR + 0] = 0.5f,
|
||||
[SEAL_LP_LS_SUN_COLOR + 1] = 0.5f,
|
||||
[SEAL_LP_LS_SUN_COLOR + 2] = 0.5f,
|
||||
};
|
||||
memcpy(out, lit_param_defaults, sizeof(lit_param_defaults));
|
||||
}
|
||||
|
||||
bool lit_parse(uint8_t *data, size_t size, float *out)
|
||||
{
|
||||
if (size != 8 + RE_NR_LIGHT_PARAMS * 4 || memcmp(data, "LITP", 4) != 0) {
|
||||
WARNING("invalid .lit file");
|
||||
return false;
|
||||
}
|
||||
struct buffer r;
|
||||
buffer_init(&r, data, size);
|
||||
buffer_skip(&r, 4); // "LITP"
|
||||
int32_t version = buffer_read_int32(&r);
|
||||
if (version != 0) {
|
||||
WARNING("unsupported .lit version %d", version);
|
||||
return false;
|
||||
}
|
||||
lit_reset(out);
|
||||
for (int i = 0; i < RE_NR_LIGHT_PARAMS; i++)
|
||||
out[i] = buffer_read_float(&r);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "system4.h"
|
||||
#include "system4/aar.h"
|
||||
#include "system4/archive.h"
|
||||
#include "system4/cg.h"
|
||||
#include "system4/hashtable.h"
|
||||
#include "system4/string.h"
|
||||
@@ -98,6 +99,7 @@ static void unload_instance(struct RE_instance *instance)
|
||||
static void free_instance(struct RE_instance *instance)
|
||||
{
|
||||
unload_instance(instance);
|
||||
free(instance->light_params);
|
||||
xfree_aligned(instance);
|
||||
}
|
||||
|
||||
@@ -249,6 +251,7 @@ struct RE_plugin *RE_plugin_new(enum RE_plugin_version version)
|
||||
plugin->fog_near = 1.0;
|
||||
plugin->fog_far = 10.0;
|
||||
glm_vec3_one(plugin->fog_color);
|
||||
lit_reset(plugin->light_params);
|
||||
return plugin;
|
||||
}
|
||||
|
||||
@@ -431,6 +434,10 @@ bool RE_instance_set_type(struct RE_instance *instance, int type)
|
||||
instance->motion->instance = instance;
|
||||
break;
|
||||
case RE_ITYPE_DIRECTIONAL_LIGHT:
|
||||
if (re_plugin_version >= RE_SEAL_PLUGIN) {
|
||||
instance->light_params = xmalloc(RE_NR_LIGHT_PARAMS * sizeof(float));
|
||||
lit_reset(instance->light_params);
|
||||
}
|
||||
break;
|
||||
case RE_ITYPE_SPECULAR_LIGHT:
|
||||
break;
|
||||
@@ -526,6 +533,16 @@ bool RE_instance_load(struct RE_instance *instance, const char *name)
|
||||
}
|
||||
}
|
||||
return true;
|
||||
case RE_ITYPE_DIRECTIONAL_LIGHT:
|
||||
if (re_plugin_version >= RE_SEAL_PLUGIN) {
|
||||
struct archive_data *dfile = archive_get_by_name(instance->plugin->aar, name);
|
||||
if (!dfile)
|
||||
return false;
|
||||
bool ok = lit_parse(dfile->data, dfile->size, instance->light_params);
|
||||
archive_free_data(dfile);
|
||||
return ok;
|
||||
}
|
||||
return false;
|
||||
default:
|
||||
WARNING("Invalid instance type %d", instance->type);
|
||||
return false;
|
||||
@@ -786,6 +803,11 @@ bool RE_plugin_get_camera_z_vector(struct RE_plugin *plugin, vec3 out)
|
||||
return true;
|
||||
}
|
||||
|
||||
void RE_plugin_reset_light_param(struct RE_plugin *plugin)
|
||||
{
|
||||
lit_reset(plugin->light_params);
|
||||
}
|
||||
|
||||
void RE_instance_update_local_transform(struct RE_instance *inst)
|
||||
{
|
||||
vec3 euler = {
|
||||
|
||||
+48
-8
@@ -16,6 +16,7 @@
|
||||
|
||||
#include <cglm/cglm.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "system4.h"
|
||||
#include "system4/aar.h"
|
||||
@@ -2449,8 +2450,25 @@ static bool SealEngine_IsExistInstanceMotion(int plugin, int instance, struct st
|
||||
//bool SealEngine_AddLineList(int PluginNumber, int InstanceNumber, float X0, float Y0, float Z0, int Color0, float X1, float Y1, float Z1, int Color1);
|
||||
HLL_WARN_UNIMPLEMENTED(false, bool, SealEngine, SetInstanceCircleShadowRadius, int PluginNumber, int InstanceNumber, float CircleShadowRadius);
|
||||
//float SealEngine_GetInstanceCircleShadowRadius(int PluginNumber, int InstanceNumber);
|
||||
//bool SealEngine_LoadInstanceLightParam(int PluginNumber, int InstanceNumber);
|
||||
HLL_WARN_UNIMPLEMENTED(false, bool, SealEngine, StoreInstanceLightParam, int PluginNumber, int InstanceNumber);
|
||||
static bool SealEngine_LoadInstanceLightParam(int plugin, int instance)
|
||||
{
|
||||
struct RE_plugin *rp = get_plugin(plugin);
|
||||
struct RE_instance *ri = get_instance(plugin, instance);
|
||||
if (!rp || !ri || !ri->light_params)
|
||||
return false;
|
||||
memcpy(ri->light_params, rp->light_params, RE_NR_LIGHT_PARAMS * sizeof(float));
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SealEngine_StoreInstanceLightParam(int plugin, int instance)
|
||||
{
|
||||
struct RE_plugin *rp = get_plugin(plugin);
|
||||
struct RE_instance *ri = get_instance(plugin, instance);
|
||||
if (!rp || !ri || !ri->light_params)
|
||||
return false;
|
||||
memcpy(rp->light_params, ri->light_params, RE_NR_LIGHT_PARAMS * sizeof(float));
|
||||
return true;
|
||||
}
|
||||
static bool SealEngine_SetInstanceUseMagSpeed(int plugin, int instance, bool use_mag_speed)
|
||||
{
|
||||
struct RE_instance *ri = get_instance(plugin, instance);
|
||||
@@ -2517,9 +2535,31 @@ static bool SealEngine_TransformPosToViewPos(int PluginNumber, float x, float y,
|
||||
return RE_plugin_transform_pos_to_view_pos(get_plugin(PluginNumber), x, y, -z, view_x, view_y);
|
||||
}
|
||||
|
||||
HLL_WARN_UNIMPLEMENTED(false, bool, SealEngine, ResetLightParam, int PluginNumber);
|
||||
//bool SealEngine_SetLightParam(int PluginNumber, int Type, float Value);
|
||||
//float SealEngine_GetLightParam(int PluginNumber, int Type);
|
||||
static bool SealEngine_ResetLightParam(int plugin)
|
||||
{
|
||||
struct RE_plugin *rp = get_plugin(plugin);
|
||||
if (!rp)
|
||||
return false;
|
||||
RE_plugin_reset_light_param(rp);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool SealEngine_SetLightParam(int plugin, int type, float value)
|
||||
{
|
||||
struct RE_plugin *rp = get_plugin(plugin);
|
||||
if (!rp || (unsigned)type >= RE_NR_LIGHT_PARAMS)
|
||||
return false;
|
||||
rp->light_params[type] = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
static float SealEngine_GetLightParam(int plugin, int type)
|
||||
{
|
||||
struct RE_plugin *rp = get_plugin(plugin);
|
||||
if (!rp || (unsigned)type >= RE_NR_LIGHT_PARAMS)
|
||||
return 0.0f;
|
||||
return rp->light_params[type];
|
||||
}
|
||||
HLL_QUIET_UNIMPLEMENTED(false, bool, SealEngine, IsThreadLoadingMode, int PluginNumber);
|
||||
//bool SealEngine_ClearCache(int PluginNumber);
|
||||
//bool SealEngine_GetHistogram(int PluginNumber, struct page **HistogramList);
|
||||
@@ -2582,7 +2622,7 @@ HLL_QUIET_UNIMPLEMENTED(false, bool, SealEngine, IsThreadLoadingMode, int Plugin
|
||||
HLL_TODO_EXPORT(AddLineList, SealEngine_AddLineList), \
|
||||
HLL_EXPORT(SetInstanceCircleShadowRadius, SealEngine_SetInstanceCircleShadowRadius), \
|
||||
HLL_TODO_EXPORT(GetInstanceCircleShadowRadius, SealEngine_GetInstanceCircleShadowRadius), \
|
||||
HLL_TODO_EXPORT(LoadInstanceLightParam, SealEngine_LoadInstanceLightParam), \
|
||||
HLL_EXPORT(LoadInstanceLightParam, SealEngine_LoadInstanceLightParam), \
|
||||
HLL_EXPORT(StoreInstanceLightParam, SealEngine_StoreInstanceLightParam), \
|
||||
HLL_EXPORT(SetInstanceUseMagSpeed, SealEngine_SetInstanceUseMagSpeed), \
|
||||
HLL_EXPORT(IsInstanceUseMagSpeed, SealEngine_IsInstanceUseMagSpeed), \
|
||||
@@ -2623,8 +2663,8 @@ HLL_QUIET_UNIMPLEMENTED(false, bool, SealEngine, IsThreadLoadingMode, int Plugin
|
||||
HLL_TODO_EXPORT(GetOptimizedPathLine, SealEngine_GetOptimizedPathLine), \
|
||||
HLL_EXPORT(TransformPosToViewPos, SealEngine_TransformPosToViewPos), \
|
||||
HLL_EXPORT(ResetLightParam, SealEngine_ResetLightParam), \
|
||||
HLL_TODO_EXPORT(SetLightParam, SealEngine_SetLightParam), \
|
||||
HLL_TODO_EXPORT(GetLightParam, SealEngine_GetLightParam), \
|
||||
HLL_EXPORT(SetLightParam, SealEngine_SetLightParam), \
|
||||
HLL_EXPORT(GetLightParam, SealEngine_GetLightParam), \
|
||||
HLL_EXPORT(IsThreadLoadingMode, SealEngine_IsThreadLoadingMode), \
|
||||
HLL_TODO_EXPORT(ClearCache, SealEngine_ClearCache), \
|
||||
HLL_TODO_EXPORT(GetHistogram, SealEngine_GetHistogram)
|
||||
|
||||
Reference in New Issue
Block a user