mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-10 15:22:04 +00:00
[vulkan] Update the sky matrix
Regardless of whether the sky is spinning or not, the matrix needs to be updated with the current origin in order to get the direction vector right in the shader. Also, it's in the update that the required x-y plane rotation gets in so the skies move in the correct direction.
This commit is contained in:
parent
981fcca76d
commit
cd26073b6a
4 changed files with 52 additions and 36 deletions
|
@ -133,10 +133,6 @@ typedef struct bspctx_s {
|
||||||
struct qfv_tex_s *default_skybox;
|
struct qfv_tex_s *default_skybox;
|
||||||
struct qfv_tex_s *skybox_tex;
|
struct qfv_tex_s *skybox_tex;
|
||||||
VkDescriptorSet skybox_descriptor;
|
VkDescriptorSet skybox_descriptor;
|
||||||
vec4f_t sky_rotation[2];
|
|
||||||
vec4f_t sky_velocity;
|
|
||||||
vec4f_t sky_fix;
|
|
||||||
double sky_time;
|
|
||||||
|
|
||||||
quat_t default_color;
|
quat_t default_color;
|
||||||
quat_t last_color;
|
quat_t last_color;
|
||||||
|
|
|
@ -68,6 +68,11 @@ typedef struct matrixctx_s {
|
||||||
struct qfv_stagebuf_s *stage;
|
struct qfv_stagebuf_s *stage;
|
||||||
VkDescriptorPool pool;
|
VkDescriptorPool pool;
|
||||||
VkDescriptorSetLayout setLayout;
|
VkDescriptorSetLayout setLayout;
|
||||||
|
|
||||||
|
vec4f_t sky_rotation[2];
|
||||||
|
vec4f_t sky_velocity;
|
||||||
|
vec4f_t sky_fix;
|
||||||
|
double sky_time;
|
||||||
} matrixctx_t;
|
} matrixctx_t;
|
||||||
|
|
||||||
struct vulkan_ctx_s;
|
struct vulkan_ctx_s;
|
||||||
|
@ -77,6 +82,7 @@ void Vulkan_CalcProjectionMatrices (struct vulkan_ctx_s *ctx);
|
||||||
void Vulkan_CalcViewMatrix (struct vulkan_ctx_s *ctx);
|
void Vulkan_CalcViewMatrix (struct vulkan_ctx_s *ctx);
|
||||||
void Vulkan_SetViewMatrix (struct vulkan_ctx_s *ctx, mat4f_t view);
|
void Vulkan_SetViewMatrix (struct vulkan_ctx_s *ctx, mat4f_t view);
|
||||||
void Vulkan_SetSkyMatrix (struct vulkan_ctx_s *ctx, mat4f_t sky);
|
void Vulkan_SetSkyMatrix (struct vulkan_ctx_s *ctx, mat4f_t sky);
|
||||||
|
void Vulkan_SetSkyMatrix (struct vulkan_ctx_s *ctx, mat4f_t sky);
|
||||||
|
|
||||||
void Vulkan_Matrix_Init (struct vulkan_ctx_s *ctx);
|
void Vulkan_Matrix_Init (struct vulkan_ctx_s *ctx);
|
||||||
void Vulkan_Matrix_Shutdown (struct vulkan_ctx_s *ctx);
|
void Vulkan_Matrix_Shutdown (struct vulkan_ctx_s *ctx);
|
||||||
|
|
|
@ -413,13 +413,6 @@ Vulkan_BuildDisplayLists (model_t **models, int num_models, vulkan_ctx_t *ctx)
|
||||||
bsppoly_t *poly;
|
bsppoly_t *poly;
|
||||||
mod_brush_t *brush;
|
mod_brush_t *brush;
|
||||||
|
|
||||||
bctx->sky_fix = (vec4f_t) { 0, 0, 1, 1 } * sqrtf (0.5);
|
|
||||||
bctx->sky_rotation[0] = (vec4f_t) { 0, 0, 0, 1};
|
|
||||||
bctx->sky_rotation[1] = bctx->sky_rotation[0];
|
|
||||||
bctx->sky_velocity = (vec4f_t) { };
|
|
||||||
bctx->sky_velocity = qexpf (bctx->sky_velocity);
|
|
||||||
bctx->sky_time = vr_data.realtime;
|
|
||||||
|
|
||||||
// run through all surfaces, chaining them to their textures, thus
|
// run through all surfaces, chaining them to their textures, thus
|
||||||
// effectively sorting the surfaces by texture (without worrying about
|
// effectively sorting the surfaces by texture (without worrying about
|
||||||
// surface order on the same texture chain).
|
// surface order on the same texture chain).
|
||||||
|
@ -948,30 +941,7 @@ turb_end (vulkan_ctx_t *ctx)
|
||||||
|
|
||||||
bsp_end_subpass (bframe->cmdSet.a[QFV_bspTurb], ctx);
|
bsp_end_subpass (bframe->cmdSet.a[QFV_bspTurb], ctx);
|
||||||
}
|
}
|
||||||
/*XXX
|
|
||||||
static void
|
|
||||||
spin (mat4f_t mat, bspctx_t *bctx)
|
|
||||||
{
|
|
||||||
vec4f_t q;
|
|
||||||
mat4f_t m;
|
|
||||||
float blend;
|
|
||||||
|
|
||||||
while (vr_data.realtime - bctx->sky_time > 1) {
|
|
||||||
bctx->sky_rotation[0] = bctx->sky_rotation[1];
|
|
||||||
bctx->sky_rotation[1] = qmulf (bctx->sky_velocity,
|
|
||||||
bctx->sky_rotation[0]);
|
|
||||||
bctx->sky_time += 1;
|
|
||||||
}
|
|
||||||
blend = bound (0, (vr_data.realtime - bctx->sky_time), 1);
|
|
||||||
|
|
||||||
q = Blend (bctx->sky_rotation[0], bctx->sky_rotation[1], blend);
|
|
||||||
q = normalf (qmulf (bctx->sky_fix, q));
|
|
||||||
mat4fidentity (mat);
|
|
||||||
VectorNegate (r_origin, mat[3]);
|
|
||||||
mat4fquat (m, q);
|
|
||||||
mmulf (mat, m, mat);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
sky_begin (qfv_renderframe_t *rFrame)
|
sky_begin (qfv_renderframe_t *rFrame)
|
||||||
{
|
{
|
||||||
|
@ -981,8 +951,6 @@ sky_begin (qfv_renderframe_t *rFrame)
|
||||||
bctx->default_color[3] = 1;
|
bctx->default_color[3] = 1;
|
||||||
QuatCopy (bctx->default_color, bctx->last_color);
|
QuatCopy (bctx->default_color, bctx->last_color);
|
||||||
|
|
||||||
//XXX spin (ctx->matrices.sky_3d, bctx);
|
|
||||||
|
|
||||||
bspframe_t *bframe = &bctx->frames.a[ctx->curFrame];
|
bspframe_t *bframe = &bctx->frames.a[ctx->curFrame];
|
||||||
|
|
||||||
DARRAY_APPEND (&rFrame->subpassCmdSets[QFV_passTranslucent],
|
DARRAY_APPEND (&rFrame->subpassCmdSets[QFV_passTranslucent],
|
||||||
|
|
|
@ -86,6 +86,32 @@ setup_view (vulkan_ctx_t *ctx)
|
||||||
Vulkan_SetViewMatrix (ctx, view);
|
Vulkan_SetViewMatrix (ctx, view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_sky (vulkan_ctx_t *ctx)
|
||||||
|
{
|
||||||
|
__auto_type mctx = ctx->matrix_context;
|
||||||
|
vec4f_t q;
|
||||||
|
mat4f_t m;
|
||||||
|
float blend;
|
||||||
|
mat4f_t mat;
|
||||||
|
|
||||||
|
while (vr_data.realtime - mctx->sky_time > 1) {
|
||||||
|
mctx->sky_rotation[0] = mctx->sky_rotation[1];
|
||||||
|
mctx->sky_rotation[1] = qmulf (mctx->sky_velocity,
|
||||||
|
mctx->sky_rotation[0]);
|
||||||
|
mctx->sky_time += 1;
|
||||||
|
}
|
||||||
|
blend = bound (0, (vr_data.realtime - mctx->sky_time), 1);
|
||||||
|
|
||||||
|
q = Blend (mctx->sky_rotation[0], mctx->sky_rotation[1], blend);
|
||||||
|
q = normalf (qmulf (mctx->sky_fix, q));
|
||||||
|
mat4fidentity (mat);
|
||||||
|
VectorNegate (r_origin, mat[3]);
|
||||||
|
mat4fquat (m, q);
|
||||||
|
mmulf (mat, m, mat);
|
||||||
|
Vulkan_SetSkyMatrix (ctx, mat);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Vulkan_SetViewMatrix (vulkan_ctx_t *ctx, mat4f_t view)
|
Vulkan_SetViewMatrix (vulkan_ctx_t *ctx, mat4f_t view)
|
||||||
{
|
{
|
||||||
|
@ -97,6 +123,17 @@ Vulkan_SetViewMatrix (vulkan_ctx_t *ctx, mat4f_t view)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Vulkan_SetSkyMatrix (vulkan_ctx_t *ctx, mat4f_t sky)
|
||||||
|
{
|
||||||
|
__auto_type mctx = ctx->matrix_context;
|
||||||
|
|
||||||
|
if (memcmp (mctx->matrices.Sky, sky, sizeof (mat4f_t))) {
|
||||||
|
memcpy (mctx->matrices.Sky, sky, sizeof (mat4f_t));
|
||||||
|
mctx->dirty = mctx->frames.size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Vulkan_Matrix_Draw (qfv_renderframe_t *rFrame)
|
Vulkan_Matrix_Draw (qfv_renderframe_t *rFrame)
|
||||||
{
|
{
|
||||||
|
@ -108,6 +145,7 @@ Vulkan_Matrix_Draw (qfv_renderframe_t *rFrame)
|
||||||
__auto_type mframe = &mctx->frames.a[ctx->curFrame];
|
__auto_type mframe = &mctx->frames.a[ctx->curFrame];
|
||||||
|
|
||||||
setup_view (ctx);
|
setup_view (ctx);
|
||||||
|
setup_sky (ctx);
|
||||||
|
|
||||||
if (mctx->dirty <= 0) {
|
if (mctx->dirty <= 0) {
|
||||||
mctx->dirty = 0;
|
mctx->dirty = 0;
|
||||||
|
@ -241,10 +279,18 @@ Vulkan_Matrix_Init (vulkan_ctx_t *ctx)
|
||||||
}
|
}
|
||||||
free (sets);
|
free (sets);
|
||||||
|
|
||||||
|
mctx->sky_fix = (vec4f_t) { 0, 0, 1, 1 } * sqrtf (0.5);
|
||||||
|
mctx->sky_rotation[0] = (vec4f_t) { 0, 0, 0, 1};
|
||||||
|
mctx->sky_rotation[1] = mctx->sky_rotation[0];
|
||||||
|
mctx->sky_velocity = (vec4f_t) { };
|
||||||
|
mctx->sky_velocity = qexpf (mctx->sky_velocity);
|
||||||
|
mctx->sky_time = vr_data.realtime;
|
||||||
|
|
||||||
mat4fidentity (mctx->matrices.Projection3d);
|
mat4fidentity (mctx->matrices.Projection3d);
|
||||||
mat4fidentity (mctx->matrices.View);
|
mat4fidentity (mctx->matrices.View);
|
||||||
mat4fidentity (mctx->matrices.Sky);
|
mat4fidentity (mctx->matrices.Sky);
|
||||||
mat4fidentity (mctx->matrices.Projection2d);
|
mat4fidentity (mctx->matrices.Projection2d);
|
||||||
|
|
||||||
mctx->dirty = mctx->frames.size;
|
mctx->dirty = mctx->frames.size;
|
||||||
|
|
||||||
mctx->stage = QFV_CreateStagingBuffer (device, "matrix",
|
mctx->stage = QFV_CreateStagingBuffer (device, "matrix",
|
||||||
|
|
Loading…
Reference in a new issue