vk: make sure studio model vertices are local space
TODO: - revert not applying rotationmatrix in local vk_studio code - make sure that prev_frame stuff hasn't changed
This commit is contained in:
parent
e49f517dc0
commit
091c61a45f
|
@ -15,6 +15,7 @@
|
|||
#include "protocol.h"
|
||||
#include "enginefeatures.h"
|
||||
#include "pm_movevars.h"
|
||||
#include "xash3d_types.h"
|
||||
|
||||
#include <memory.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -67,7 +68,7 @@ void R_PrevFrame_StartFrame( void )
|
|||
g_prev.previous_frame_id = (g_prev.frame_index - 1) % PREV_FRAMES_COUNT;
|
||||
}
|
||||
|
||||
void R_PrevFrame_SaveCurrentBoneTransforms( int entity_id, matrix3x4* bones_transforms )
|
||||
void R_PrevFrame_SaveCurrentBoneTransforms( int entity_id, matrix3x4* bones_transforms, const matrix4x4 rotationmatrix_inv )
|
||||
{
|
||||
prev_state_t *current_frame = CURRENT_FRAME();
|
||||
|
||||
|
@ -78,7 +79,9 @@ void R_PrevFrame_SaveCurrentBoneTransforms( int entity_id, matrix3x4* bones_tran
|
|||
|
||||
for( int i = 0; i < MAXSTUDIOBONES; i++ )
|
||||
{
|
||||
Matrix3x4_Copy( current_frame->bones_worldtransform[i], bones_transforms[i] );
|
||||
// FIXME I don't see how this can work. It has only a single copy of bones transforms, but they are not global, they're per-model
|
||||
// Better way to handle this would be to avoid messing with bones_transforms at all, and just cache post-transformed vertices
|
||||
Matrix3x4_ConcatTransforms( current_frame->bones_worldtransform[i], bones_transforms[i], rotationmatrix_inv );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "vk_common.h"
|
||||
|
||||
void R_PrevFrame_StartFrame(void);
|
||||
void R_PrevFrame_SaveCurrentBoneTransforms(int entity_id, matrix3x4* bones_transforms);
|
||||
void R_PrevFrame_SaveCurrentBoneTransforms( int entity_id, matrix3x4* bones_transforms, const matrix4x4 rotationmatrix_inv );
|
||||
void R_PrevFrame_SaveCurrentState(int entity_id, matrix4x4 model_transform);
|
||||
matrix3x4* R_PrevFrame_BoneTransforms(int entity_id);
|
||||
void R_PrevFrame_ModelTransform( int entity_id, matrix4x4 model_matrix );
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "eiface.h"
|
||||
#include "xash3d_mathlib.h"
|
||||
#include "protocol.h" // MAX_DLIGHTS
|
||||
#include "xash3d_types.h"
|
||||
|
||||
#include <memory.h>
|
||||
|
||||
|
@ -763,10 +764,11 @@ void VK_RenderModelDraw( const cl_entity_t *ent, vk_render_model_t* model ) {
|
|||
|
||||
static struct {
|
||||
vk_render_model_t model;
|
||||
matrix4x4 transform;
|
||||
vk_render_geometry_t geometries[MAX_DYNAMIC_GEOMETRY];
|
||||
} g_dynamic_model = {0};
|
||||
|
||||
void VK_RenderModelDynamicBegin( vk_render_type_e render_type, const vec4_t color, const matrix4x4 transform, const char *debug_name_fmt, ... ) {
|
||||
void VK_RenderModelDynamicBegin( vk_render_type_e render_type, const vec4_t color, const matrix3x4 transform, const char *debug_name_fmt, ... ) {
|
||||
va_list argptr;
|
||||
va_start( argptr, debug_name_fmt );
|
||||
vsnprintf(g_dynamic_model.model.debug_name, sizeof(g_dynamic_model.model.debug_name), debug_name_fmt, argptr );
|
||||
|
@ -778,10 +780,9 @@ void VK_RenderModelDynamicBegin( vk_render_type_e render_type, const vec4_t colo
|
|||
g_dynamic_model.model.render_type = render_type;
|
||||
g_dynamic_model.model.lightmap = 0;
|
||||
Vector4Copy(color, g_dynamic_model.model.color);
|
||||
Matrix4x4_LoadIdentity(g_dynamic_model.transform);
|
||||
if (transform)
|
||||
Matrix4x4_Copy(g_dynamic_model.model.transform, transform);
|
||||
else
|
||||
Matrix4x4_LoadIdentity(g_dynamic_model.model.transform);
|
||||
Matrix3x4_Copy(g_dynamic_model.transform, transform);
|
||||
}
|
||||
void VK_RenderModelDynamicAddGeometry( const vk_render_geometry_t *geom ) {
|
||||
ASSERT(g_dynamic_model.model.geometries);
|
||||
|
@ -799,6 +800,7 @@ void VK_RenderModelDynamicCommit( void ) {
|
|||
g_render.stats.dynamic_model_count++;
|
||||
g_dynamic_model.model.dynamic = true;
|
||||
VK_RenderModelInit( &g_dynamic_model.model );
|
||||
Matrix4x4_Copy(g_dynamic_model.model.transform, g_dynamic_model.transform);
|
||||
VK_RenderModelDraw( NULL, &g_dynamic_model.model );
|
||||
}
|
||||
|
||||
|
|
|
@ -2165,6 +2165,10 @@ static void R_StudioDrawPoints( void )
|
|||
pskinref = (short *)((byte *)m_pStudioHeader + m_pStudioHeader->skinindex);
|
||||
if( m_skinnum != 0 ) pskinref += (m_skinnum * m_pStudioHeader->numskinref);
|
||||
|
||||
matrix4x4 rotationmatrix = {0}, rotationmatrix_inv = {0};
|
||||
Matrix3x4_Copy(rotationmatrix, g_studio.rotationmatrix);
|
||||
Matrix4x4_Invert_Simple(rotationmatrix_inv, rotationmatrix);
|
||||
|
||||
if( FBitSet( m_pStudioHeader->flags, STUDIO_HAS_BONEWEIGHTS ) && m_pSubModel->blendvertinfoindex != 0 && m_pSubModel->blendnorminfoindex != 0 )
|
||||
{
|
||||
mstudioboneweight_t *pvertweight = (mstudioboneweight_t *)((byte *)m_pStudioHeader + m_pSubModel->blendvertinfoindex);
|
||||
|
@ -2178,7 +2182,7 @@ static void R_StudioDrawPoints( void )
|
|||
R_LightStrength( pvertbone[i], pstudioverts[i], g_studio.lightpos[i] );
|
||||
}
|
||||
|
||||
R_PrevFrame_SaveCurrentBoneTransforms( RI.currententity->index, g_studio.worldtransform );
|
||||
R_PrevFrame_SaveCurrentBoneTransforms( RI.currententity->index, g_studio.worldtransform, rotationmatrix_inv);
|
||||
matrix3x4* prev_bones_transforms = R_PrevFrame_BoneTransforms( RI.currententity->index );
|
||||
for( i = 0; i < m_pSubModel->numverts; i++ )
|
||||
{
|
||||
|
@ -2194,11 +2198,14 @@ static void R_StudioDrawPoints( void )
|
|||
}
|
||||
else
|
||||
{
|
||||
R_PrevFrame_SaveCurrentBoneTransforms( RI.currententity->index, g_studio.bonestransform );
|
||||
R_PrevFrame_SaveCurrentBoneTransforms( RI.currententity->index, g_studio.bonestransform, rotationmatrix_inv );
|
||||
|
||||
matrix3x4* prev_bones_transforms = R_PrevFrame_BoneTransforms( RI.currententity->index );
|
||||
for( i = 0; i < m_pSubModel->numverts; i++ )
|
||||
{
|
||||
Matrix3x4_VectorTransform( g_studio.bonestransform[pvertbone[i]], pstudioverts[i], g_studio.verts[i] );
|
||||
vec3_t v;
|
||||
Matrix3x4_VectorTransform( g_studio.bonestransform[pvertbone[i]], pstudioverts[i], v);
|
||||
Matrix3x4_VectorTransform( rotationmatrix_inv, v, g_studio.verts[i] );
|
||||
Matrix3x4_VectorTransform( prev_bones_transforms[pvertbone[i]], pstudioverts[i], g_studio.prev_verts[i] );
|
||||
R_LightStrength( pvertbone[i], pstudioverts[i], g_studio.lightpos[i] );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue