Advertisement
Guest User

dontcry coder 1337 pt hd youtuber

a guest
Jul 21st, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. void math::set_matrix_position( vec3_t pos, matrix3x4& matrix ) {
  2. for( size_t i{ }; i < 3; ++i ) {
  3. matrix[ i ][ 3 ] = pos[ i ];
  4. }
  5. }
  6.  
  7. vec3_t math::get_matrix_position( const matrix3x4& src ) {
  8. return vec3_t( src[ 0 ][ 3 ], src[ 1 ][ 3 ], src[ 2 ][ 3 ] );
  9. }
  10.  
  11. void angle_matrix( vec3_t angles, matrix3x4& matrix ) {
  12. float sr, sp, sy, cr, cp, cy;
  13.  
  14. sp = sinf( angles.x * M_PIRAD );
  15. cp = cosf( angles.x * M_PIRAD );
  16. sy = sinf( angles.y * M_PIRAD );
  17. cy = cosf( angles.y * M_PIRAD );
  18. sr = sinf( angles.z * M_PIRAD );
  19. cr = cosf( angles.z * M_PIRAD );
  20.  
  21. matrix[ 0 ][ 0 ] = cp * cy;
  22. matrix[ 1 ][ 0 ] = cp * sy;
  23. matrix[ 2 ][ 0 ] = -sp;
  24.  
  25. float crcy = cr * cy;
  26. float crsy = cr * sy;
  27. float srcy = sr * cy;
  28. float srsy = sr * sy;
  29. matrix[ 0 ][ 1 ] = sp * srcy - crsy;
  30. matrix[ 1 ][ 1 ] = sp * srsy + crcy;
  31. matrix[ 2 ][ 1 ] = sr * cp;
  32.  
  33. matrix[ 0 ][ 2 ] = ( sp*crcy + srsy );
  34. matrix[ 1 ][ 2 ] = ( sp*crsy - srcy );
  35. matrix[ 2 ][ 2 ] = cr * cp;
  36.  
  37. matrix[ 0 ][ 3 ] = 0.f;
  38. matrix[ 1 ][ 3 ] = 0.f;
  39. matrix[ 2 ][ 3 ] = 0.f;
  40. }
  41.  
  42. void angle_imatrix( vec3_t angles, matrix3x4& matrix ) {
  43. float sr, sp, sy, cr, cp, cy;
  44.  
  45. sp = sinf( angles.x * M_PIRAD );
  46. cp = cosf( angles.x * M_PIRAD );
  47. sy = sinf( angles.y * M_PIRAD );
  48. cy = cosf( angles.y * M_PIRAD );
  49. sr = sinf( angles.z * M_PIRAD );
  50. cr = cosf( angles.z * M_PIRAD );
  51.  
  52. matrix[ 0 ][ 0 ] = cp * cy;
  53. matrix[ 0 ][ 1 ] = cp * sy;
  54. matrix[ 0 ][ 2 ] = -sp;
  55. matrix[ 1 ][ 0 ] = sr * sp*cy + cr * -sy;
  56. matrix[ 1 ][ 1 ] = sr * sp*sy + cr * cy;
  57. matrix[ 1 ][ 2 ] = sr * cp;
  58. matrix[ 2 ][ 0 ] = ( cr*sp*cy + -sr * -sy );
  59. matrix[ 2 ][ 1 ] = ( cr*sp*sy + -sr * cy );
  60. matrix[ 2 ][ 2 ] = cr * cp;
  61. matrix[ 0 ][ 3 ] = 0.f;
  62. matrix[ 1 ][ 3 ] = 0.f;
  63. matrix[ 2 ][ 3 ] = 0.f;
  64. }
  65.  
  66. void angle_matrix( vec3_t angles, matrix3x4& matrix, vec3_t origin ) {
  67. angle_matrix( angles, matrix );
  68. set_matrix_position( origin, matrix );
  69. }
  70.  
  71. vec3_t matrix_angles( const matrix3x4& matrix ) {
  72. //thx strackoverflow
  73. vec3_t angles;
  74. float forward[ 3 ];
  75. float left[ 3 ];
  76. float up[ 3 ];
  77.  
  78. forward[ 0 ] = matrix[ 0 ][ 0 ];
  79. forward[ 1 ] = matrix[ 1 ][ 0 ];
  80. forward[ 2 ] = matrix[ 2 ][ 0 ];
  81. left[ 0 ] = matrix[ 0 ][ 1 ];
  82. left[ 1 ] = matrix[ 1 ][ 1 ];
  83. left[ 2 ] = matrix[ 2 ][ 1 ];
  84. up[ 2 ] = matrix[ 2 ][ 2 ];
  85.  
  86. float xy_dist = sqrtf( forward[ 0 ] * forward[ 0 ] + forward[ 1 ] * forward[ 1 ] );
  87.  
  88. if( xy_dist > 0.001f ) {
  89. angles.y = RAD2DEG( atan2f( forward[ 1 ], forward[ 0 ] ) );
  90. angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) );
  91. angles.z = RAD2DEG( atan2f( left[ 2 ], up[ 2 ] ) );
  92. }
  93. else {
  94. angles.y = RAD2DEG( atan2f( -left[ 0 ], left[ 1 ] ) );
  95. angles.x = RAD2DEG( atan2f( -forward[ 2 ], xy_dist ) );
  96.  
  97. angles.z = 0;
  98. }
  99.  
  100. return angles;
  101. }
  102.  
  103. void rotate_matrix( vec3_t angles, vec3_t origin, float degrees, matrix3x4& matrix ) {
  104. angles.y += degrees;
  105. angles.clamp( );
  106.  
  107. vec3_t rotated( 0, degrees, 0 );
  108. matrix3x4 rotated_matrix;
  109. angle_matrix( rotated, rotated_matrix );
  110.  
  111. vec3_t delta = get_matrix_position( matrix ) - origin;
  112. vec3_t out = vector_transform( delta, rotated_matrix );
  113.  
  114. matrix3x4 bone_rotation, matrix_out;
  115. memcpy( &bone_rotation, &matrix, sizeof( matrix3x4 ) );
  116.  
  117. set_matrix_position( vec3_t( ), bone_rotation );
  118. concat_transforms( rotated_matrix, bone_rotation, matrix_out );
  119. auto angles_out = matrix_angles( matrix_out );
  120. angle_matrix( angles_out, matrix, out );
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement