| 1074 | |
| 1075 | COVERAGE(HMM_LinearCombineV4M4, 1) |
| 1076 | static inline HMM_Vec4 HMM_LinearCombineV4M4(HMM_Vec4 Left, HMM_Mat4 Right) |
| 1077 | { |
| 1078 | ASSERT_COVERED(HMM_LinearCombineV4M4); |
| 1079 | |
| 1080 | HMM_Vec4 Result; |
| 1081 | #ifdef HANDMADE_MATH__USE_SSE |
| 1082 | Result.SSE = _mm_mul_ps(_mm_shuffle_ps(Left.SSE, Left.SSE, 0x00), Right.Columns[0].SSE); |
| 1083 | Result.SSE = _mm_add_ps(Result.SSE, _mm_mul_ps(_mm_shuffle_ps(Left.SSE, Left.SSE, 0x55), Right.Columns[1].SSE)); |
| 1084 | Result.SSE = _mm_add_ps(Result.SSE, _mm_mul_ps(_mm_shuffle_ps(Left.SSE, Left.SSE, 0xaa), Right.Columns[2].SSE)); |
| 1085 | Result.SSE = _mm_add_ps(Result.SSE, _mm_mul_ps(_mm_shuffle_ps(Left.SSE, Left.SSE, 0xff), Right.Columns[3].SSE)); |
| 1086 | #else |
| 1087 | Result.X = Left.Elements[0] * Right.Columns[0].X; |
| 1088 | Result.Y = Left.Elements[0] * Right.Columns[0].Y; |
| 1089 | Result.Z = Left.Elements[0] * Right.Columns[0].Z; |
| 1090 | Result.W = Left.Elements[0] * Right.Columns[0].W; |
| 1091 | |
| 1092 | Result.X += Left.Elements[1] * Right.Columns[1].X; |
| 1093 | Result.Y += Left.Elements[1] * Right.Columns[1].Y; |
| 1094 | Result.Z += Left.Elements[1] * Right.Columns[1].Z; |
| 1095 | Result.W += Left.Elements[1] * Right.Columns[1].W; |
| 1096 | |
| 1097 | Result.X += Left.Elements[2] * Right.Columns[2].X; |
| 1098 | Result.Y += Left.Elements[2] * Right.Columns[2].Y; |
| 1099 | Result.Z += Left.Elements[2] * Right.Columns[2].Z; |
| 1100 | Result.W += Left.Elements[2] * Right.Columns[2].W; |
| 1101 | |
| 1102 | Result.X += Left.Elements[3] * Right.Columns[3].X; |
| 1103 | Result.Y += Left.Elements[3] * Right.Columns[3].Y; |
| 1104 | Result.Z += Left.Elements[3] * Right.Columns[3].Z; |
| 1105 | Result.W += Left.Elements[3] * Right.Columns[3].W; |
| 1106 | #endif |
| 1107 | |
| 1108 | return Result; |
| 1109 | } |
| 1110 | |
| 1111 | /* |
| 1112 | * 2x2 Matrices |
no outgoing calls
no test coverage detected