vk: begin refactoring rendermodel api, instantiate sprites, crash gpu
This commit is contained in:
parent
c157c9acfc
commit
e9ea962bc0
|
@ -33,6 +33,8 @@ typedef struct vk_brush_model_s {
|
|||
|
||||
int *animated_indexes;
|
||||
int animated_indexes_count;
|
||||
|
||||
matrix4x4 prev_transform;
|
||||
} vk_brush_model_t;
|
||||
|
||||
static struct {
|
||||
|
@ -402,7 +404,7 @@ static qboolean isSurfaceAnimated( const msurface_t *s, const struct texture_s *
|
|||
return true;
|
||||
}
|
||||
|
||||
void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, float blend, const matrix4x4 transform ) {
|
||||
void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, float blend, const matrix4x4 in_transform ) {
|
||||
// Expect all buffers to be bound
|
||||
const model_t *mod = ent->model;
|
||||
vk_brush_model_t *bmodel = mod->cache.data;
|
||||
|
@ -412,46 +414,47 @@ void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, float blend, co
|
|||
return;
|
||||
}
|
||||
|
||||
if (transform)
|
||||
Matrix4x4_Copy(bmodel->render_model.transform, transform);
|
||||
matrix4x4 transform;
|
||||
if (in_transform)
|
||||
Matrix4x4_Copy(transform, in_transform);
|
||||
else
|
||||
Matrix4x4_LoadIdentity(bmodel->render_model.transform);
|
||||
Matrix4x4_LoadIdentity(transform);
|
||||
|
||||
Vector4Set(bmodel->render_model.color, 1.f, 1.f, 1.f, 1.f);
|
||||
vec4_t color = {1, 1, 1, 1};
|
||||
vk_render_type_e render_type = kVkRenderTypeSolid;
|
||||
switch (render_mode) {
|
||||
case kRenderNormal:
|
||||
Vector4Set(bmodel->render_model.color, 1.f, 1.f, 1.f, 1.f);
|
||||
Vector4Set(color, 1.f, 1.f, 1.f, 1.f);
|
||||
render_type = kVkRenderTypeSolid;
|
||||
break;
|
||||
case kRenderTransColor:
|
||||
render_type = kVkRenderType_A_1mA_RW;
|
||||
Vector4Set(bmodel->render_model.color,
|
||||
Vector4Set(color,
|
||||
ent->curstate.rendercolor.r / 255.f,
|
||||
ent->curstate.rendercolor.g / 255.f,
|
||||
ent->curstate.rendercolor.b / 255.f,
|
||||
blend);
|
||||
break;
|
||||
case kRenderTransAdd:
|
||||
Vector4Set(bmodel->render_model.color, blend, blend, blend, 1.f);
|
||||
Vector4Set(color, blend, blend, blend, 1.f);
|
||||
render_type = kVkRenderType_A_1_R;
|
||||
break;
|
||||
case kRenderTransAlpha:
|
||||
if( gEngine.EngineGetParm( PARM_QUAKE_COMPATIBLE, 0 ))
|
||||
{
|
||||
render_type = kVkRenderType_A_1mA_RW;
|
||||
Vector4Set(bmodel->render_model.color, 1.f, 1.f, 1.f, blend);
|
||||
Vector4Set(color, 1.f, 1.f, 1.f, blend);
|
||||
}
|
||||
else
|
||||
{
|
||||
Vector4Set(bmodel->render_model.color, 1.f, 1.f, 1.f, 1.f);
|
||||
Vector4Set(color, 1.f, 1.f, 1.f, 1.f);
|
||||
render_type = kVkRenderType_AT;
|
||||
}
|
||||
break;
|
||||
case kRenderTransTexture:
|
||||
case kRenderGlow:
|
||||
render_type = kVkRenderType_A_1mA_R;
|
||||
Vector4Set(bmodel->render_model.color, 1.f, 1.f, 1.f, blend);
|
||||
Vector4Set(color, 1.f, 1.f, 1.f, blend);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -460,7 +463,7 @@ void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, float blend, co
|
|||
bmodel->render_model.lightmap = (render_mode == kRenderNormal || render_mode == kRenderTransAlpha) ? 1 : 0;
|
||||
|
||||
if (bmodel->num_water_surfaces) {
|
||||
brushDrawWaterSurfaces(ent, bmodel->render_model.color, bmodel->render_model.transform);
|
||||
brushDrawWaterSurfaces(ent, color, transform);
|
||||
}
|
||||
|
||||
if (bmodel->render_model.num_geometries == 0)
|
||||
|
@ -491,8 +494,17 @@ void VK_BrushModelDraw( const cl_entity_t *ent, int render_mode, float blend, co
|
|||
}
|
||||
}
|
||||
|
||||
bmodel->render_model.render_type = render_type;
|
||||
VK_RenderModelDraw(&bmodel->render_model, ent->index);
|
||||
R_RenderModelDraw(&bmodel->render_model, (r_model_draw_t){
|
||||
.render_type = render_type,
|
||||
.color = &color,
|
||||
.transform = &transform,
|
||||
.prev_transform = &bmodel->prev_transform,
|
||||
|
||||
.geometries_changed = bmodel->animated_indexes,
|
||||
.geometries_changed_count = bmodel->animated_indexes_count,
|
||||
});
|
||||
|
||||
Matrix4x4_Copy(bmodel->prev_transform, transform);
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
|
@ -857,9 +869,6 @@ qboolean VK_BrushModelLoad( model_t *mod ) {
|
|||
// Cannot deallocate bmodel as we might still have staging references to its memory
|
||||
return false;
|
||||
}
|
||||
|
||||
bmodel->render_model.geometries_changed = bmodel->animated_indexes;
|
||||
bmodel->render_model.geometries_changed_count = bmodel->animated_indexes_count;
|
||||
}
|
||||
|
||||
g_brush.stat.total_vertices += sizes.num_indices;
|
||||
|
|
|
@ -810,6 +810,8 @@ qboolean R_VkInit( void )
|
|||
void R_VkShutdown( void ) {
|
||||
XVK_CHECK(vkDeviceWaitIdle(vk_core.device));
|
||||
|
||||
R_SpriteShutdown();
|
||||
|
||||
if (vk_core.rtx)
|
||||
{
|
||||
VK_LightsShutdown();
|
||||
|
|
|
@ -406,15 +406,15 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render
|
|||
if (!uploadKusochki(model, render_model))
|
||||
return;
|
||||
} else {
|
||||
if (!uploadKusochkiSubset(model, render_model, render_model->geometries_changed, render_model->geometries_changed_count))
|
||||
return;
|
||||
/* FIXME move to RT_FrameAddModel if (!uploadKusochkiSubset(model, render_model, render_model->geometries_changed, render_model->geometries_changed_count)) */
|
||||
/* return; */
|
||||
}
|
||||
|
||||
// TODO needed for brush models only
|
||||
// (? TODO studio models?)
|
||||
for (int i = 0; i < render_model->dynamic_polylights_count; ++i) {
|
||||
rt_light_add_polygon_t *const polylight = render_model->dynamic_polylights + i;
|
||||
polylight->transform_row = (const matrix3x4*)render_model->transform;
|
||||
polylight->transform_row = (const matrix3x4*)render_model->deprecate.transform;
|
||||
polylight->dynamic = true;
|
||||
RT_LightAddPolygon(polylight);
|
||||
}
|
||||
|
@ -422,10 +422,10 @@ void VK_RayFrameAddModel( vk_ray_model_t *model, const vk_render_model_t *render
|
|||
draw_instance->model_toremove = model;
|
||||
draw_instance->blas_addr = model->blas_addr;
|
||||
draw_instance->kusochki_offset = model->kusochki_offset;
|
||||
draw_instance->material_mode = materialModeFromRenderType(render_model->render_type);
|
||||
Vector4Copy(render_model->color, draw_instance->color);
|
||||
Matrix3x4_Copy(draw_instance->transform_row, render_model->transform);
|
||||
Matrix4x4_Copy(draw_instance->prev_transform_row, render_model->prev_transform);
|
||||
draw_instance->material_mode = materialModeFromRenderType(render_model->deprecate.render_type);
|
||||
Vector4Copy(render_model->deprecate.color, draw_instance->color);
|
||||
Matrix3x4_Copy(draw_instance->transform_row, render_model->deprecate.transform);
|
||||
Matrix4x4_Copy(draw_instance->prev_transform_row, render_model->deprecate.prev_transform);
|
||||
|
||||
g_ray_model_state.frame.instances_count++;
|
||||
}
|
||||
|
|
|
@ -650,7 +650,8 @@ qboolean VK_RenderModelInit_old( vk_render_model_t *model ) {
|
|||
model->ray_model = VK_RayModelCreate(args);
|
||||
model->dynamic_polylights = NULL;
|
||||
model->dynamic_polylights_count = 0;
|
||||
Matrix4x4_LoadIdentity(model->transform);
|
||||
Matrix4x4_LoadIdentity(model->deprecate.transform);
|
||||
Matrix4x4_LoadIdentity(model->deprecate.prev_transform);
|
||||
return !!model->ray_model;
|
||||
}
|
||||
|
||||
|
@ -662,12 +663,11 @@ qboolean VK_RenderModelCreate( vk_render_model_t *model, vk_render_model_init_t
|
|||
memset(model, 0, sizeof(*model));
|
||||
Q_strncpy(model->debug_name, args.name, sizeof(model->debug_name));
|
||||
|
||||
Matrix4x4_LoadIdentity(model->transform);
|
||||
Matrix4x4_LoadIdentity(model->prev_transform);
|
||||
|
||||
// TODO this is dynamic and should be removed
|
||||
model->render_type = kVkRenderTypeSolid;
|
||||
Vector4Set(model->color, 1, 1, 1, 1);
|
||||
// TODO these are dynamic and should be removed
|
||||
Matrix4x4_LoadIdentity(model->deprecate.transform);
|
||||
Matrix4x4_LoadIdentity(model->deprecate.prev_transform);
|
||||
model->deprecate.render_type = kVkRenderTypeSolid;
|
||||
Vector4Set(model->deprecate.color, 1, 1, 1, 1);
|
||||
|
||||
model->geometries = args.geometries;
|
||||
model->num_geometries = args.geometries_count;
|
||||
|
@ -701,44 +701,19 @@ static void uboComputeAndSetMVPFromModel( const matrix4x4 model ) {
|
|||
Matrix4x4_ToArrayFloatGL(mvp, (float*)g_render_state.dirty_uniform_data.mvp);
|
||||
}
|
||||
|
||||
void VK_RenderModelDraw( vk_render_model_t* model, int ent_index_prev_frame__toremove ) {
|
||||
static void submitToTraditionalRender( const vk_render_model_t *model, const matrix4x4 transform, const vec4_t color, int render_type ) {
|
||||
int current_texture = -1;
|
||||
int element_count = 0;
|
||||
int index_offset = -1;
|
||||
int vertex_offset = 0;
|
||||
|
||||
uboComputeAndSetMVPFromModel( model->transform );
|
||||
uboComputeAndSetMVPFromModel( transform );
|
||||
|
||||
// TODO get rid of this dirty ubo thing
|
||||
Vector4Copy(model->color, g_render_state.dirty_uniform_data.color);
|
||||
Vector4Copy(color, g_render_state.dirty_uniform_data.color);
|
||||
ASSERT(model->lightmap <= MAX_LIGHTMAPS);
|
||||
const int lightmap = model->lightmap > 0 ? tglob.lightmapTextures[model->lightmap - 1] : tglob.whiteTexture;
|
||||
|
||||
++g_render.stats.models_count;
|
||||
|
||||
// TODO track prev transform directly as a member in vk_render_model_t
|
||||
if (g_render_state.current_frame_is_ray_traced) {
|
||||
if (ent_index_prev_frame__toremove >= 0 && model != NULL) {
|
||||
R_PrevFrame_SaveCurrentState( ent_index_prev_frame__toremove, model->transform );
|
||||
R_PrevFrame_ModelTransform( ent_index_prev_frame__toremove, model->prev_transform );
|
||||
}
|
||||
else {
|
||||
Matrix4x4_Copy( model->prev_transform, model->transform );
|
||||
}
|
||||
|
||||
if (model->rt_model) {
|
||||
RT_FrameAddModel(model->rt_model, (rt_frame_add_model_t){
|
||||
.render_type = model->render_type,
|
||||
.transform = (const matrix3x4*)&model->transform,
|
||||
.prev_transform = (const matrix3x4*)&model->prev_transform,
|
||||
.color = &model->color,
|
||||
});
|
||||
} else
|
||||
VK_RayFrameAddModel(model->ray_model, model);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
drawCmdPushDebugLabelBegin( model->debug_name );
|
||||
|
||||
for (int i = 0; i < model->num_geometries; ++i) {
|
||||
|
@ -758,7 +733,7 @@ void VK_RenderModelDraw( vk_render_model_t* model, int ent_index_prev_frame__tor
|
|||
render_draw_t draw = {
|
||||
.lightmap = lightmap,
|
||||
.texture = current_texture,
|
||||
.pipeline_index = model->render_type,
|
||||
.pipeline_index = render_type,
|
||||
.element_count = element_count,
|
||||
.vertex_offset = vertex_offset,
|
||||
.index_offset = index_offset,
|
||||
|
@ -782,7 +757,7 @@ void VK_RenderModelDraw( vk_render_model_t* model, int ent_index_prev_frame__tor
|
|||
const render_draw_t draw = {
|
||||
.lightmap = lightmap,
|
||||
.texture = current_texture,
|
||||
.pipeline_index = model->render_type,
|
||||
.pipeline_index = render_type,
|
||||
.element_count = element_count,
|
||||
.vertex_offset = vertex_offset,
|
||||
.index_offset = index_offset,
|
||||
|
@ -794,6 +769,51 @@ void VK_RenderModelDraw( vk_render_model_t* model, int ent_index_prev_frame__tor
|
|||
drawCmdPushDebugLabelEnd();
|
||||
}
|
||||
|
||||
void VK_RenderModelDraw_old( vk_render_model_t* model, int ent_index_prev_frame__toremove ) {
|
||||
++g_render.stats.models_count;
|
||||
|
||||
// TODO track prev transform directly as a member in vk_render_model_t
|
||||
if (g_render_state.current_frame_is_ray_traced) {
|
||||
if (ent_index_prev_frame__toremove >= 0 && model != NULL) {
|
||||
R_PrevFrame_SaveCurrentState( ent_index_prev_frame__toremove, model->deprecate.transform );
|
||||
R_PrevFrame_ModelTransform( ent_index_prev_frame__toremove, model->deprecate.prev_transform );
|
||||
}
|
||||
else {
|
||||
Matrix4x4_Copy( model->deprecate.prev_transform, model->deprecate.transform );
|
||||
}
|
||||
|
||||
if (model->rt_model) {
|
||||
RT_FrameAddModel(model->rt_model, (rt_frame_add_model_t){
|
||||
.render_type = model->deprecate.render_type,
|
||||
.transform = (const matrix3x4*)&model->deprecate.transform,
|
||||
.prev_transform = (const matrix3x4*)&model->deprecate.prev_transform,
|
||||
.color = &model->deprecate.color,
|
||||
});
|
||||
} else
|
||||
VK_RayFrameAddModel(model->ray_model, model);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
submitToTraditionalRender( model, model->deprecate.transform, model->deprecate.color, model->deprecate.render_type );
|
||||
}
|
||||
|
||||
void R_RenderModelDraw(const vk_render_model_t *model, r_model_draw_t args) {
|
||||
++g_render.stats.models_count;
|
||||
|
||||
if (g_render_state.current_frame_is_ray_traced) {
|
||||
ASSERT(model->rt_model);
|
||||
RT_FrameAddModel(model->rt_model, (rt_frame_add_model_t){
|
||||
.render_type = args.render_type,
|
||||
.transform = (const matrix3x4*)args.transform,
|
||||
.prev_transform = (const matrix3x4*)args.prev_transform,
|
||||
.color = args.color,
|
||||
});
|
||||
} else {
|
||||
submitToTraditionalRender(model, *args.transform, *args.color, args.render_type);
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_DYNAMIC_GEOMETRY 256
|
||||
|
||||
static struct {
|
||||
|
@ -811,9 +831,9 @@ void VK_RenderModelDynamicBegin( vk_render_type_e render_type, const vec4_t colo
|
|||
ASSERT(!g_dynamic_model.model.geometries);
|
||||
g_dynamic_model.model.geometries = g_dynamic_model.geometries;
|
||||
g_dynamic_model.model.num_geometries = 0;
|
||||
g_dynamic_model.model.render_type = render_type;
|
||||
g_dynamic_model.model.deprecate.render_type = render_type;
|
||||
g_dynamic_model.model.lightmap = 0;
|
||||
Vector4Copy(color, g_dynamic_model.model.color);
|
||||
Vector4Copy(color, g_dynamic_model.model.deprecate.color);
|
||||
Matrix4x4_LoadIdentity(g_dynamic_model.transform);
|
||||
if (transform)
|
||||
Matrix3x4_Copy(g_dynamic_model.transform, transform);
|
||||
|
@ -834,8 +854,8 @@ void VK_RenderModelDynamicCommit( void ) {
|
|||
g_render.stats.dynamic_model_count++;
|
||||
g_dynamic_model.model.dynamic = true;
|
||||
VK_RenderModelInit_old( &g_dynamic_model.model );
|
||||
Matrix4x4_Copy(g_dynamic_model.model.transform, g_dynamic_model.transform);
|
||||
VK_RenderModelDraw( &g_dynamic_model.model, -1 );
|
||||
Matrix4x4_Copy(g_dynamic_model.model.deprecate.transform, g_dynamic_model.transform);
|
||||
VK_RenderModelDraw_old( &g_dynamic_model.model, -1 );
|
||||
}
|
||||
|
||||
g_dynamic_model.model.debug_name[0] = '\0';
|
||||
|
|
|
@ -104,19 +104,13 @@ typedef struct vk_render_model_s {
|
|||
#define MAX_MODEL_NAME_LENGTH 64
|
||||
char debug_name[MAX_MODEL_NAME_LENGTH];
|
||||
|
||||
// TODO these two are dynamic, extract them to draw args?
|
||||
vk_render_type_e render_type;
|
||||
vec4_t color;
|
||||
|
||||
// TODO per-geometry?
|
||||
int lightmap; // <= 0 if no lightmap
|
||||
|
||||
int num_geometries;
|
||||
vk_render_geometry_t *geometries;
|
||||
|
||||
// TODO potentially dynamic. extract to draw args?
|
||||
int geometries_changed_count;
|
||||
int *geometries_changed;
|
||||
struct rt_model_s *rt_model;
|
||||
|
||||
// This model will be one-frame only, its buffers are not preserved between frames
|
||||
// TODO deprecate
|
||||
|
@ -132,12 +126,16 @@ typedef struct vk_render_model_s {
|
|||
struct rt_light_add_polygon_s *dynamic_polylights;
|
||||
int dynamic_polylights_count;
|
||||
|
||||
struct {
|
||||
// TODO these two are dynamic, extract them to draw args?
|
||||
vk_render_type_e render_type;
|
||||
vec4_t color;
|
||||
matrix4x4 transform;
|
||||
|
||||
// previous frame ObjectToWorld (model) matrix
|
||||
matrix4x4 prev_transform;
|
||||
|
||||
struct rt_model_s *rt_model;
|
||||
// TODO potentially dynamic. extract to draw args?
|
||||
} deprecate;
|
||||
} vk_render_model_t;
|
||||
|
||||
qboolean VK_RenderModelInit_old( vk_render_model_t* model );
|
||||
|
@ -151,7 +149,21 @@ typedef struct {
|
|||
qboolean VK_RenderModelCreate( vk_render_model_t *model, vk_render_model_init_t args );
|
||||
void VK_RenderModelDestroy( vk_render_model_t* model );
|
||||
|
||||
void VK_RenderModelDraw( vk_render_model_t* model, int ent_index_prev_frame__toremove );
|
||||
void VK_RenderModelDraw_old( vk_render_model_t* model, int ent_index_prev_frame__toremove );
|
||||
|
||||
typedef struct {
|
||||
vk_render_type_e render_type;
|
||||
|
||||
// These are "consumed": copied into internal storage and can be pointers to stack vars
|
||||
const vec4_t *color;
|
||||
const matrix4x4 *transform, *prev_transform;
|
||||
|
||||
// These are expected to be alive and valid until frame end at least
|
||||
int geometries_changed_count;
|
||||
int *geometries_changed;
|
||||
} r_model_draw_t;
|
||||
|
||||
void R_RenderModelDraw(const vk_render_model_t *model, r_model_draw_t args);
|
||||
|
||||
// TODO Begin and commit should be removed
|
||||
void VK_RenderModelDynamicBegin( vk_render_type_e render_type, const vec4_t color, const matrix3x4 transform, const char *debug_name_fmt, ... );
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "vk_geometry.h"
|
||||
#include "vk_scene.h"
|
||||
#include "r_speeds.h"
|
||||
#include "vk_math.h"
|
||||
|
||||
#include "sprite.h"
|
||||
#include "xash3d_mathlib.h"
|
||||
|
@ -22,11 +23,108 @@ static struct {
|
|||
struct {
|
||||
int sprites;
|
||||
} stats;
|
||||
|
||||
struct {
|
||||
r_geometry_range_t geom;
|
||||
vk_render_geometry_t geometry;
|
||||
vk_render_model_t model;
|
||||
} quad;
|
||||
} g_sprite;
|
||||
|
||||
static qboolean createQuadModel(void) {
|
||||
g_sprite.quad.geom = R_GeometryRangeAlloc(4, 6);
|
||||
if (g_sprite.quad.geom.block_handle.size == 0) {
|
||||
gEngine.Con_Printf(S_ERROR "Cannot allocate geometry for sprite quad\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
const r_geometry_range_lock_t lock = R_GeometryRangeLock(&g_sprite.quad.geom);
|
||||
|
||||
vec3_t point;
|
||||
vk_vertex_t *dst_vtx;
|
||||
uint16_t *dst_idx;
|
||||
|
||||
dst_vtx = lock.vertices;
|
||||
dst_idx = lock.indices;
|
||||
|
||||
const vec3_t org = {0, 0, 0};
|
||||
const vec3_t v_right = {1, 0, 0};
|
||||
const vec3_t v_up = {0, 1, 0};
|
||||
vec3_t v_normal;
|
||||
CrossProduct(v_right, v_up, v_normal);
|
||||
|
||||
VectorMA( org, -1.f, v_up, point );
|
||||
VectorMA( point, -1.f, v_right, dst_vtx[0].pos );
|
||||
dst_vtx[0].gl_tc[0] = 0.f;
|
||||
dst_vtx[0].gl_tc[1] = 1.f;
|
||||
dst_vtx[0].lm_tc[0] = dst_vtx[0].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[0].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[0].normal);
|
||||
|
||||
VectorMA( org, 1.f, v_up, point );
|
||||
VectorMA( point, -1.f, v_right, dst_vtx[1].pos );
|
||||
dst_vtx[1].gl_tc[0] = 0.f;
|
||||
dst_vtx[1].gl_tc[1] = 0.f;
|
||||
dst_vtx[1].lm_tc[0] = dst_vtx[1].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[1].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[1].normal);
|
||||
|
||||
VectorMA( org, 1.f, v_up, point );
|
||||
VectorMA( point, 1.f, v_right, dst_vtx[2].pos );
|
||||
dst_vtx[2].gl_tc[0] = 1.f;
|
||||
dst_vtx[2].gl_tc[1] = 0.f;
|
||||
dst_vtx[2].lm_tc[0] = dst_vtx[2].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[2].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[2].normal);
|
||||
|
||||
VectorMA( org, -1.f, v_up, point );
|
||||
VectorMA( point, 1.f, v_right, dst_vtx[3].pos );
|
||||
dst_vtx[3].gl_tc[0] = 1.f;
|
||||
dst_vtx[3].gl_tc[1] = 1.f;
|
||||
dst_vtx[3].lm_tc[0] = dst_vtx[3].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[3].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[3].normal);
|
||||
|
||||
dst_idx[0] = 0;
|
||||
dst_idx[1] = 1;
|
||||
dst_idx[2] = 2;
|
||||
dst_idx[3] = 0;
|
||||
dst_idx[4] = 2;
|
||||
dst_idx[5] = 3;
|
||||
|
||||
R_GeometryRangeUnlock( &lock );
|
||||
|
||||
g_sprite.quad.geometry = (vk_render_geometry_t){
|
||||
.max_vertex = 4,
|
||||
.vertex_offset = g_sprite.quad.geom.vertices.unit_offset,
|
||||
|
||||
.element_count = 6,
|
||||
.index_offset = g_sprite.quad.geom.indices.unit_offset,
|
||||
|
||||
.material = kXVkMaterialRegular,
|
||||
.texture = tglob.defaultTexture,
|
||||
.emissive = {1,1,1},
|
||||
};
|
||||
|
||||
return VK_RenderModelCreate(&g_sprite.quad.model, (vk_render_model_init_t){
|
||||
.name = "sprite",
|
||||
.geometries = &g_sprite.quad.geometry,
|
||||
.geometries_count = 1,
|
||||
});
|
||||
}
|
||||
|
||||
qboolean R_SpriteInit(void) {
|
||||
R_SpeedsRegisterMetric(&g_sprite.stats.sprites, "sprites_count", kSpeedsMetricCount);
|
||||
return true;
|
||||
|
||||
return createQuadModel();
|
||||
}
|
||||
|
||||
void R_SpriteShutdown(void) {
|
||||
if (g_sprite.quad.model.num_geometries)
|
||||
VK_RenderModelDestroy(&g_sprite.quad.model);
|
||||
|
||||
if (g_sprite.quad.geom.block_handle.size)
|
||||
R_GeometryRangeFree(&g_sprite.quad.geom);
|
||||
}
|
||||
|
||||
static mspriteframe_t *R_GetSpriteFrame( const model_t *pModel, int frame, float yaw )
|
||||
|
@ -672,81 +770,52 @@ static vk_render_type_e spriteRenderModeToRenderType( int render_mode ) {
|
|||
}
|
||||
|
||||
static void R_DrawSpriteQuad( const char *debug_name, mspriteframe_t *frame, vec3_t org, vec3_t v_right, vec3_t v_up, float scale, int texture, int render_mode, const vec4_t color ) {
|
||||
r_geometry_buffer_lock_t buffer;
|
||||
if (!R_GeometryBufferAllocOnceAndLock( &buffer, 4, 6)) {
|
||||
gEngine.Con_Printf(S_ERROR "Cannot allocate geometry for sprite quad\n");
|
||||
return;
|
||||
}
|
||||
|
||||
vec3_t point;
|
||||
vk_vertex_t *dst_vtx;
|
||||
uint16_t *dst_idx;
|
||||
|
||||
dst_vtx = buffer.vertices.ptr;
|
||||
dst_idx = buffer.indices.ptr;
|
||||
|
||||
vec3_t v_normal;
|
||||
CrossProduct(v_right, v_up, v_normal);
|
||||
vec3_t point;
|
||||
//CrossProduct(v_right, v_up, v_normal);
|
||||
|
||||
VectorMA( org, frame->down * scale, v_up, point );
|
||||
VectorMA( point, frame->left * scale, v_right, dst_vtx[0].pos );
|
||||
dst_vtx[0].gl_tc[0] = 0.f;
|
||||
dst_vtx[0].gl_tc[1] = 1.f;
|
||||
dst_vtx[0].lm_tc[0] = dst_vtx[0].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[0].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[0].normal);
|
||||
matrix4x4 transform;
|
||||
// FIXME orient sprites
|
||||
//VectorMA( org, frame->down * scale, v_up, point );
|
||||
//VectorMA( point, frame->left * scale, v_right, dst_vtx[0].pos );
|
||||
//vtx[0] = org + down * scale + v_up + left * scale * v_right;
|
||||
Matrix4x4_CreateScale(transform, scale);
|
||||
Matrix4x4_SetOrigin(transform, org[0], org[1], org[2]);
|
||||
const vk_render_type_e render_type = spriteRenderModeToRenderType(render_mode);
|
||||
|
||||
VectorMA( org, frame->up * scale, v_up, point );
|
||||
VectorMA( point, frame->left * scale, v_right, dst_vtx[1].pos );
|
||||
dst_vtx[1].gl_tc[0] = 0.f;
|
||||
dst_vtx[1].gl_tc[1] = 0.f;
|
||||
dst_vtx[1].lm_tc[0] = dst_vtx[1].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[1].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[1].normal);
|
||||
R_RenderModelDraw(&g_sprite.quad.model, (r_model_draw_t){
|
||||
.render_type = render_type,
|
||||
.color = (const vec4_t*)&color,
|
||||
//.color = (const vec4_t*)color,
|
||||
.transform = &transform,
|
||||
.prev_transform = &transform,
|
||||
|
||||
VectorMA( org, frame->up * scale, v_up, point );
|
||||
VectorMA( point, frame->right * scale, v_right, dst_vtx[2].pos );
|
||||
dst_vtx[2].gl_tc[0] = 1.f;
|
||||
dst_vtx[2].gl_tc[1] = 0.f;
|
||||
dst_vtx[2].lm_tc[0] = dst_vtx[2].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[2].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[2].normal);
|
||||
.geometries_changed = NULL,
|
||||
.geometries_changed_count = 0,
|
||||
});
|
||||
|
||||
VectorMA( org, frame->down * scale, v_up, point );
|
||||
VectorMA( point, frame->right * scale, v_right, dst_vtx[3].pos );
|
||||
dst_vtx[3].gl_tc[0] = 1.f;
|
||||
dst_vtx[3].gl_tc[1] = 1.f;
|
||||
dst_vtx[3].lm_tc[0] = dst_vtx[3].lm_tc[1] = 0.f;
|
||||
Vector4Set(dst_vtx[3].color, 255, 255, 255, 255);
|
||||
VectorCopy(v_normal, dst_vtx[3].normal);
|
||||
#if 0
|
||||
typedef struct {
|
||||
const char *debug_name;
|
||||
const vk_render_model_t *model;
|
||||
const matrix4x4 *transform;
|
||||
const vec4_t *color;
|
||||
vk_render_type_e render_type;
|
||||
//TODO int material_mode;
|
||||
int texture;
|
||||
} vk_render_model_draw_instance_t;
|
||||
|
||||
dst_idx[0] = 0;
|
||||
dst_idx[1] = 1;
|
||||
dst_idx[2] = 2;
|
||||
dst_idx[3] = 0;
|
||||
dst_idx[4] = 2;
|
||||
dst_idx[5] = 3;
|
||||
|
||||
R_GeometryBufferUnlock( &buffer );
|
||||
|
||||
{
|
||||
const vk_render_geometry_t geometry = {
|
||||
const vk_render_model_draw_instance_t args = {
|
||||
.debug_name = debug_name,
|
||||
.model = g_sprite.quad_model,
|
||||
.transform = &transform,
|
||||
.color = &color,
|
||||
.render_type = render_type,
|
||||
.texture = texture,
|
||||
.material = kXVkMaterialRegular,
|
||||
|
||||
.max_vertex = 4,
|
||||
.vertex_offset = buffer.vertices.unit_offset,
|
||||
|
||||
.element_count = 6,
|
||||
.index_offset = buffer.indices.unit_offset,
|
||||
|
||||
.emissive = {1,1,1},
|
||||
};
|
||||
|
||||
VK_RenderModelDynamicBegin( spriteRenderModeToRenderType(render_mode), color, m_matrix4x4_identity, "%s", debug_name );
|
||||
VK_RenderModelDynamicAddGeometry( &geometry );
|
||||
VK_RenderModelDynamicCommit();
|
||||
}
|
||||
VK_RenderModelInstanced(&args);
|
||||
#endif
|
||||
}
|
||||
|
||||
static qboolean R_SpriteHasLightmap( cl_entity_t *e, int texFormat )
|
||||
|
|
|
@ -10,3 +10,4 @@ void Mod_LoadSpriteModel( model_t *mod, const void *buffer, qboolean *loaded, ui
|
|||
void R_VkSpriteDrawModel( cl_entity_t *e, float blend );
|
||||
|
||||
qboolean R_SpriteInit(void);
|
||||
void R_SpriteShutdown(void);
|
||||
|
|
Loading…
Reference in New Issue