mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-12 04:12:13 +00:00
[scene] Remove full_transform from renderer_t
I've wanted to do this for a long while, but I finally got the motivation to clean up the two uses in gl and glsl. Removes 64 bytes from the struct.
This commit is contained in:
parent
f77ad8a676
commit
f436806006
6 changed files with 39 additions and 19 deletions
|
@ -60,7 +60,7 @@ typedef struct elechain_s {
|
||||||
struct elechain_s *next;
|
struct elechain_s *next;
|
||||||
int model_index;
|
int model_index;
|
||||||
elements_t *elements;
|
elements_t *elements;
|
||||||
vec4f_t *transform;
|
const vec4f_t *transform;
|
||||||
float *color;
|
float *color;
|
||||||
} elechain_t;
|
} elechain_t;
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ typedef struct instsurf_s {
|
||||||
struct instsurf_s *tex_chain; ///< next in texture chain
|
struct instsurf_s *tex_chain; ///< next in texture chain
|
||||||
struct instsurf_s *lm_chain; ///< next in lightmap chain
|
struct instsurf_s *lm_chain; ///< next in lightmap chain
|
||||||
struct msurface_s *surface; ///< surface to render
|
struct msurface_s *surface; ///< surface to render
|
||||||
vec4f_t *transform;
|
const vec4f_t *transform;
|
||||||
float *color;
|
float *color;
|
||||||
} instsurf_t;
|
} instsurf_t;
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,6 @@ typedef struct renderer_s {
|
||||||
int fullbright;
|
int fullbright;
|
||||||
float min_light;
|
float min_light;
|
||||||
int render_id;
|
int render_id;
|
||||||
mat4f_t full_transform;
|
|
||||||
} renderer_t;
|
} renderer_t;
|
||||||
|
|
||||||
typedef struct entityset_s DARRAY_TYPE (entity_t) entityset_t;
|
typedef struct entityset_s DARRAY_TYPE (entity_t) entityset_t;
|
||||||
|
|
|
@ -60,6 +60,8 @@
|
||||||
#include "r_internal.h"
|
#include "r_internal.h"
|
||||||
#include "vid_gl.h"
|
#include "vid_gl.h"
|
||||||
|
|
||||||
|
static struct DARRAY_TYPE (mat4f_t) ent_transforms = DARRAY_STATIC_INIT (16);
|
||||||
|
|
||||||
static instsurf_t *waterchain = NULL;
|
static instsurf_t *waterchain = NULL;
|
||||||
static instsurf_t **waterchain_tail = &waterchain;
|
static instsurf_t **waterchain_tail = &waterchain;
|
||||||
static instsurf_t *sky_chain;
|
static instsurf_t *sky_chain;
|
||||||
|
@ -509,7 +511,7 @@ gl_R_DrawBrushModel (entity_t e)
|
||||||
glbspctx_t bspctx = {
|
glbspctx_t bspctx = {
|
||||||
brush,
|
brush,
|
||||||
Ent_GetComponent (e.id, scene_animation, e.reg),
|
Ent_GetComponent (e.id, scene_animation, e.reg),
|
||||||
renderer->full_transform,
|
ent_transforms.a[ent_transforms.size++],
|
||||||
renderer->colormod,
|
renderer->colormod,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -564,7 +566,7 @@ gl_R_DrawBrushModel (entity_t e)
|
||||||
|
|
||||||
qfglPushMatrix ();
|
qfglPushMatrix ();
|
||||||
gl_R_RotateForEntity (Transform_GetWorldMatrixPtr (transform));
|
gl_R_RotateForEntity (Transform_GetWorldMatrixPtr (transform));
|
||||||
qfglGetFloatv (GL_MODELVIEW_MATRIX, (vec_t*)&renderer->full_transform[0]);
|
qfglGetFloatv (GL_MODELVIEW_MATRIX, (vec_t*)&bspctx.transform[0]);
|
||||||
qfglPopMatrix ();
|
qfglPopMatrix ();
|
||||||
|
|
||||||
surf = &brush->surfaces[brush->firstmodelsurface];
|
surf = &brush->surfaces[brush->firstmodelsurface];
|
||||||
|
@ -720,8 +722,12 @@ gl_R_DrawWorld (void)
|
||||||
gl_R_DrawSkyChain (sky_chain);
|
gl_R_DrawSkyChain (sky_chain);
|
||||||
|
|
||||||
if (r_drawentities) {
|
if (r_drawentities) {
|
||||||
for (size_t i = 0; i < r_ent_queue->ent_queues[mod_brush].size; i++) { \
|
size_t count = r_ent_queue->ent_queues[mod_brush].size;
|
||||||
entity_t ent = r_ent_queue->ent_queues[mod_brush].a[i]; \
|
// ensure pointer stability of the matrix array during this frame
|
||||||
|
DARRAY_RESIZE (&ent_transforms, count);
|
||||||
|
ent_transforms.size = 0;
|
||||||
|
for (size_t i = 0; i < count; i++) {
|
||||||
|
entity_t ent = r_ent_queue->ent_queues[mod_brush].a[i];
|
||||||
gl_R_DrawBrushModel (ent);
|
gl_R_DrawBrushModel (ent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ static struct {
|
||||||
typedef struct glslbspctx_s {
|
typedef struct glslbspctx_s {
|
||||||
mod_brush_t *brush;
|
mod_brush_t *brush;
|
||||||
animation_t *animation;
|
animation_t *animation;
|
||||||
vec4f_t *transform;
|
const vec4f_t *transform;
|
||||||
float *color;
|
float *color;
|
||||||
} glslbspctx_t;
|
} glslbspctx_t;
|
||||||
|
|
||||||
|
@ -662,14 +662,11 @@ R_DrawBrushModel (entity_t e)
|
||||||
glslbspctx_t bctx = {
|
glslbspctx_t bctx = {
|
||||||
brush,
|
brush,
|
||||||
Ent_GetComponent (e.id, scene_animation, e.reg),
|
Ent_GetComponent (e.id, scene_animation, e.reg),
|
||||||
renderer->full_transform,
|
Transform_GetWorldMatrixPtr (Entity_Transform (e)),
|
||||||
renderer->colormod,
|
renderer->colormod,
|
||||||
};
|
};
|
||||||
|
|
||||||
mat4f_t mat;
|
auto mat = bctx.transform;
|
||||||
transform_t transform = Entity_Transform (e);
|
|
||||||
Transform_GetWorldMatrix (transform, mat);
|
|
||||||
memcpy (renderer->full_transform, mat, sizeof (mat));//FIXME
|
|
||||||
if (mat[0][0] != 1 || mat[1][1] != 1 || mat[2][2] != 1) {
|
if (mat[0][0] != 1 || mat[1][1] != 1 || mat[2][2] != 1) {
|
||||||
rotated = true;
|
rotated = true;
|
||||||
radius = model->radius;
|
radius = model->radius;
|
||||||
|
|
|
@ -67,6 +67,24 @@ typedef struct {
|
||||||
uint32_t matrix_base;
|
uint32_t matrix_base;
|
||||||
} shadow_push_constants_t;
|
} shadow_push_constants_t;
|
||||||
|
|
||||||
|
static renderer_t *
|
||||||
|
alias_get_renderer (entity_t ent)
|
||||||
|
{
|
||||||
|
return Ent_GetComponent (ent.id, scene_renderer, ent.reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static animation_t *
|
||||||
|
alias_get_animation (entity_t ent)
|
||||||
|
{
|
||||||
|
return Ent_GetComponent (ent.id, scene_animation, ent.reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static colormap_t *
|
||||||
|
alias_get_colormap (entity_t ent)
|
||||||
|
{
|
||||||
|
return Ent_GetComponent (ent.id, scene_colormap, ent.reg);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
alias_depth_range (qfv_taskctx_t *taskctx, float minDepth, float maxDepth)
|
alias_depth_range (qfv_taskctx_t *taskctx, float minDepth, float maxDepth)
|
||||||
{
|
{
|
||||||
|
@ -160,9 +178,9 @@ push_shadow_constants (const mat4f_t mat, float blend, uint16_t *matrix_base,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
alias_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass)
|
alias_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass,
|
||||||
|
renderer_t *renderer)
|
||||||
{
|
{
|
||||||
renderer_t *renderer = Ent_GetComponent (ent.id, scene_renderer, ent.reg);
|
|
||||||
auto model = renderer->model;
|
auto model = renderer->model;
|
||||||
aliashdr_t *hdr;
|
aliashdr_t *hdr;
|
||||||
qfv_alias_skin_t *skin;
|
qfv_alias_skin_t *skin;
|
||||||
|
@ -172,8 +190,7 @@ alias_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass)
|
||||||
hdr = Cache_Get (&model->cache);
|
hdr = Cache_Get (&model->cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
animation_t *animation = Ent_GetComponent (ent.id, scene_animation,
|
auto animation = alias_get_animation (ent);
|
||||||
ent.reg);
|
|
||||||
float blend = R_AliasGetLerpedFrames (animation, hdr);
|
float blend = R_AliasGetLerpedFrames (animation, hdr);
|
||||||
|
|
||||||
transform_t transform = Entity_Transform (ent);
|
transform_t transform = Entity_Transform (ent);
|
||||||
|
@ -190,7 +207,7 @@ alias_draw_ent (qfv_taskctx_t *taskctx, entity_t ent, bool pass)
|
||||||
QuatCopy (renderer->colormod, base_color);
|
QuatCopy (renderer->colormod, base_color);
|
||||||
QuatCopy (skin->colors, colors);
|
QuatCopy (skin->colors, colors);
|
||||||
if (Ent_HasComponent (ent.id, scene_colormap, ent.reg)) {
|
if (Ent_HasComponent (ent.id, scene_colormap, ent.reg)) {
|
||||||
colormap_t *colormap=Ent_GetComponent (ent.id, scene_colormap, ent.reg);
|
auto colormap = alias_get_colormap (ent);
|
||||||
colors[0] = colormap->top * 16 + 8;
|
colors[0] = colormap->top * 16 + 8;
|
||||||
colors[1] = colormap->bottom * 16 + 8;
|
colors[1] = colormap->bottom * 16 + 8;
|
||||||
}
|
}
|
||||||
|
@ -264,12 +281,13 @@ alias_draw (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
|
||||||
auto queue = r_ent_queue; //FIXME fetch from scene
|
auto queue = r_ent_queue; //FIXME fetch from scene
|
||||||
for (size_t i = 0; i < queue->ent_queues[mod_alias].size; i++) {
|
for (size_t i = 0; i < queue->ent_queues[mod_alias].size; i++) {
|
||||||
entity_t ent = queue->ent_queues[mod_alias].a[i];
|
entity_t ent = queue->ent_queues[mod_alias].a[i];
|
||||||
|
auto renderer = alias_get_renderer (ent);
|
||||||
// FIXME hack the depth range to prevent view model
|
// FIXME hack the depth range to prevent view model
|
||||||
// from poking into walls
|
// from poking into walls
|
||||||
if (vmod && ent.id == vr_data.view_model.id) {
|
if (vmod && ent.id == vr_data.view_model.id) {
|
||||||
alias_depth_range (taskctx, 0.7, 1);
|
alias_depth_range (taskctx, 0.7, 1);
|
||||||
}
|
}
|
||||||
alias_draw_ent (taskctx, ent, pass);
|
alias_draw_ent (taskctx, ent, pass, renderer);
|
||||||
// unhack in case the view_model is not the last
|
// unhack in case the view_model is not the last
|
||||||
if (vmod && ent.id == vr_data.view_model.id) {
|
if (vmod && ent.id == vr_data.view_model.id) {
|
||||||
alias_depth_range (taskctx, 0, 1);
|
alias_depth_range (taskctx, 0, 1);
|
||||||
|
|
Loading…
Reference in a new issue