add ModelGetTransform()

This commit is contained in:
Garux
2025-10-31 16:00:12 +05:00
parent 6e5067828a
commit 4e9c91e86d
3 changed files with 29 additions and 53 deletions
+5 -29
View File
@@ -1053,8 +1053,7 @@ static void PopulateTraceNodes(){
/* add worldspawn triangles */
Matrix4 transform( g_matrix4_identity );
PopulateWithBSPModel( bspModels[ 0 ], transform );
PopulateWithBSPModel( bspModels[ 0 ], g_matrix4_identity );
/* walk each entity list */
for ( std::size_t i = 1; i < entities.size(); ++i )
@@ -1071,29 +1070,6 @@ static void PopulateTraceNodes(){
continue;
}
/* get entity origin */
const Vector3 origin( e.vectorForKey( "origin" ) );
/* get scale */
Vector3 scale( 1 );
if( !e.read_keyvalue( scale, "modelscale_vec" ) )
if( e.read_keyvalue( scale[0], "modelscale" ) )
scale[1] = scale[2] = scale[0];
/* get "angle" (yaw) or "angles" (pitch yaw roll), store as (roll pitch yaw) */
Vector3 angles( 0 );
if ( e.read_keyvalue( angles, "angles" ) || e.read_keyvalue( angles.y(), "angle" ) )
angles = angles_pyr2rpy( angles );
/* set transform matrix (thanks spog) */
transform = g_matrix4_identity;
matrix4_transform_by_euler_xyz_degrees( transform, origin, angles, scale );
/* hack: Stable-1_2 and trunk have differing row/column major matrix order
this transpose is necessary with Stable-1_2
uncomment the following line with old m4x4_t (non 1.3/spog_branch) code */
//% m4x4_transpose( transform );
/* get model */
value = e.valueForKey( "model" );
@@ -1111,12 +1087,12 @@ static void PopulateTraceNodes(){
continue;
}
// using only origin for bmodels transform; only exception in vq3 is func_pendulum transform determined by angle/angles
PopulateWithBSPModel( bspModels[ m ], matrix4_translation_for_vec3( origin ) );
PopulateWithBSPModel( bspModels[ m ], matrix4_translation_for_vec3( e.vectorForKey( "origin" ) ) );
break;
/* external model */
default:
PopulateWithPicoModel( castShadows, LoadModelWalker( value, e.intForKey( "_frame", "frame" ) ), transform );
PopulateWithPicoModel( castShadows, LoadModelWalker( value, e.intForKey( "_frame", "frame" ) ), ModelGetTransform( e ) );
continue;
}
@@ -1136,12 +1112,12 @@ static void PopulateTraceNodes(){
if ( m <= 0 || m >= bspModels.size() ) {
continue;
}
PopulateWithBSPModel( bspModels[ m ], matrix4_translation_for_vec3( origin ) );
PopulateWithBSPModel( bspModels[ m ], matrix4_translation_for_vec3( e.vectorForKey( "origin" ) ) );
break;
/* external model */
default:
PopulateWithPicoModel( castShadows, LoadModelWalker( value, e.intForKey( "_frame2" ) ), transform );
PopulateWithPicoModel( castShadows, LoadModelWalker( value, e.intForKey( "_frame2" ) ), ModelGetTransform( e ) );
continue;
}
}
+22 -24
View File
@@ -1052,11 +1052,6 @@ void InsertModel( const char *name, const char *skin, int frame, const Matrix4&
}
}
/* hack: Stable-1_2 and trunk have differing row/column major matrix order
this transpose is necessary with Stable-1_2
uncomment the following line with old m4x4_t (non 1.3/spog_branch) code */
//% m4x4_transpose( transform );
/* each surface on the model will become a new map drawsurface */
//% Sys_FPrintf( SYS_VRB, "Model %s has %d surfaces\n", name, numSurfaces );
for ( const auto& surface : model->m_meshes )
@@ -1226,6 +1221,27 @@ void InsertModel( const char *name, const char *skin, int frame, const Matrix4&
}
Matrix4 ModelGetTransform( const entity_t& e, const Vector3& parent_origin /* = g_vector3_identity */ ){
/* get origin */
const Vector3 origin = e.vectorForKey( "origin" ) - parent_origin; /* offset by parent, it will be added ingame */
/* get scale */
Vector3 scale( 1 );
if( !e.read_keyvalue( scale, "modelscale_vec" ) )
if( e.read_keyvalue( scale[0], "modelscale" ) )
scale[1] = scale[2] = scale[0];
/* get "angle" (yaw) or "angles" (pitch yaw roll), store as (roll pitch yaw) */
Vector3 angles( 0 );
if ( e.read_keyvalue( angles, "angles" ) || e.read_keyvalue( angles.y(), "angle" ) )
angles = angles_pyr2rpy( angles );
/* set transform matrix (thanks spog) */
Matrix4 transform( g_matrix4_identity );
matrix4_transform_by_euler_xyz_degrees( transform, origin, angles, scale );
return transform;
}
/*
AddTriangleModels()
@@ -1276,24 +1292,6 @@ void AddTriangleModels( entity_t& eparent ){
/* get spawnflags */
const int spawnFlags = e.intForKey( "spawnflags" );
/* get origin */
const Vector3 origin = e.vectorForKey( "origin" ) - eparent.origin; /* offset by parent */
/* get scale */
Vector3 scale( 1 );
if( !e.read_keyvalue( scale, "modelscale_vec" ) )
if( e.read_keyvalue( scale[0], "modelscale" ) )
scale[1] = scale[2] = scale[0];
/* get "angle" (yaw) or "angles" (pitch yaw roll), store as (roll pitch yaw) */
Vector3 angles( 0 );
if ( e.read_keyvalue( angles, "angles" ) || e.read_keyvalue( angles.y(), "angle" ) )
angles = angles_pyr2rpy( angles );
/* set transform matrix (thanks spog) */
Matrix4 transform( g_matrix4_identity );
matrix4_transform_by_euler_xyz_degrees( transform, origin, angles, scale );
/* get shader remappings */
std::list<remap_t> remaps;
for ( const auto& ep : e.epairs )
@@ -1343,6 +1341,6 @@ void AddTriangleModels( entity_t& eparent ){
const EntityCompileParams params = ParseEntityCompileParams( e, &eparent, &eparent == &entities[ 0 ] );
/* insert the model */
InsertModel( model, skin, frame, transform, &remaps, eparent, spawnFlags, clipDepth, params );
InsertModel( model, skin, frame, ModelGetTransform( e, eparent.origin ), &remaps, eparent, spawnFlags, clipDepth, params );
}
}
+2
View File
@@ -25,6 +25,8 @@
#include <functional>
#include "generic/vector.h"
Matrix4 ModelGetTransform( const entity_t& e, const Vector3& parent_origin = g_vector3_identity );
class AssMeshWalker
{
public: