Merge pull request #63 from h4570/revert-61-hotfix/matrix

Revert "Urgent hotfix in matrix multiply, added few funcs"
This commit is contained in:
Sandro Sobczyński
2020-12-13 00:19:42 +01:00
committed by GitHub
2 changed files with 62 additions and 109 deletions
+1 -3
View File
@@ -82,10 +82,8 @@ public:
rotate(t_val);
}
void rotationByAngle(const float &t_angle, const Vector3 &t_axis);
//
void setScale(const Vector3 &t_val);
void setPerspective(ScreenSettings &screen);
const void print() const;
};
+61 -106
View File
@@ -84,15 +84,6 @@ void Matrix::identity()
: "r"(this->data));
}
void Matrix::setScale(const Vector3 &t_val)
{
this->identity();
this->data[0] = t_val.x;
this->data[5] = t_val.y;
this->data[10] = t_val.z;
this->data[15] = 1.0F;
}
void Matrix::translate(const Vector3 &t_val)
{
this->data[12] += t_val.x; // 3,0
@@ -139,79 +130,75 @@ void Matrix::rotateZ(const float &t_radians)
Matrix Matrix::operator*(const Matrix &t)
{
Matrix result;
asm __volatile__(
"lqc2 vf4, 0x00(%1) \n\t"
"lqc2 vf5, 0x10(%1) \n\t"
"lqc2 vf6, 0x20(%1) \n\t"
"lqc2 vf7, 0x30(%1) \n\t"
"lqc2 vf8, 0x00(%2) \n\t"
"lqc2 vf9, 0x10(%2) \n\t"
"lqc2 vf10, 0x20(%2) \n\t"
"lqc2 vf11, 0x30(%2) \n\t"
"vmulax.xyzw ACC, vf4, vf8 \n\t"
"vmadday.xyzw ACC, vf5, vf8 \n\t"
"vmaddaz.xyzw ACC, vf6, vf8 \n\t"
"vmaddw.xyzw vf12, vf7, vf8 \n\t"
"vmulax.xyzw ACC, vf4, vf9 \n\t"
"vmadday.xyzw ACC, vf5, vf9 \n\t"
"vmaddaz.xyzw ACC, vf6, vf9 \n\t"
"vmaddw.xyzw vf13, vf7, vf9 \n\t"
"vmulax.xyzw ACC, vf4, vf10 \n\t"
"vmadday.xyzw ACC, vf5, vf10 \n\t"
"vmaddaz.xyzw ACC, vf6, vf10 \n\t"
"vmaddw.xyzw vf14, vf7, vf10 \n\t"
"vmulax.xyzw ACC, vf4, vf11 \n\t"
"vmadday.xyzw ACC, vf5, vf11 \n\t"
"vmaddaz.xyzw ACC, vf6, vf11 \n\t"
"vmaddw.xyzw vf15, vf7, vf11 \n\t"
"sqc2 vf12, 0x00(%0) \n\t"
"sqc2 vf13, 0x10(%0) \n\t"
"sqc2 vf14, 0x20(%0) \n\t"
"sqc2 vf15, 0x30(%0) \n\t"
asm volatile(
"lqc2 vf1, 0x00(%1) \n\t"
"lqc2 vf2, 0x10(%1) \n\t"
"lqc2 vf3, 0x20(%1) \n\t"
"lqc2 vf4, 0x30(%1) \n\t"
"lqc2 vf5, 0x00(%2) \n\t"
"lqc2 vf6, 0x10(%2) \n\t"
"lqc2 vf7, 0x20(%2) \n\t"
"lqc2 vf8, 0x30(%2) \n\t"
"vmulax.xyzw ACC, vf5, vf1 \n\t"
"vmadday.xyzw ACC, vf6, vf1 \n\t"
"vmaddaz.xyzw ACC, vf7, vf1 \n\t"
"vmaddw.xyzw vf1, vf8, vf1 \n\t"
"vmulax.xyzw ACC, vf5, vf2 \n\t"
"vmadday.xyzw ACC, vf6, vf2 \n\t"
"vmaddaz.xyzw ACC, vf7, vf2 \n\t"
"vmaddw.xyzw vf2, vf8, vf2 \n\t"
"vmulax.xyzw ACC, vf5, vf3 \n\t"
"vmadday.xyzw ACC, vf6, vf3 \n\t"
"vmaddaz.xyzw ACC, vf7, vf3 \n\t"
"vmaddw.xyzw vf3, vf8, vf3 \n\t"
"vmulax.xyzw ACC, vf5, vf4 \n\t"
"vmadday.xyzw ACC, vf6, vf4 \n\t"
"vmaddaz.xyzw ACC, vf7, vf4 \n\t"
"vmaddw.xyzw vf4, vf8, vf4 \n\t"
"sqc2 vf1, 0x00(%0) \n\t"
"sqc2 vf2, 0x10(%0) \n\t"
"sqc2 vf3, 0x20(%0) \n\t"
"sqc2 vf4, 0x30(%0) \n\t"
:
: "r"(result.data), "r"(this->data), "r"(t.data));
: "r"(result.data), "r"(this->data), "r"(t.data)
: "memory");
return result;
}
void Matrix::operator*=(const Matrix &t)
{
asm volatile(
"lqc2 vf4, 0x00(%1) \n\t"
"lqc2 vf5, 0x10(%1) \n\t"
"lqc2 vf6, 0x20(%1) \n\t"
"lqc2 vf7, 0x30(%1) \n\t"
"lqc2 vf8, 0x00(%2) \n\t"
"lqc2 vf9, 0x10(%2) \n\t"
"lqc2 vf10, 0x20(%2) \n\t"
"lqc2 vf11, 0x30(%2) \n\t"
"vmulax.xyzw ACC, vf4, vf8 \n\t"
"vmadday.xyzw ACC, vf5, vf8 \n\t"
"vmaddaz.xyzw ACC, vf6, vf8 \n\t"
"vmaddw.xyzw vf12, vf7, vf8 \n\t"
"vmulax.xyzw ACC, vf4, vf9 \n\t"
"vmadday.xyzw ACC, vf5, vf9 \n\t"
"vmaddaz.xyzw ACC, vf6, vf9 \n\t"
"vmaddw.xyzw vf13, vf7, vf9 \n\t"
"vmulax.xyzw ACC, vf4, vf10 \n\t"
"vmadday.xyzw ACC, vf5, vf10 \n\t"
"vmaddaz.xyzw ACC, vf6, vf10 \n\t"
"vmaddw.xyzw vf14, vf7, vf10 \n\t"
"vmulax.xyzw ACC, vf4, vf11 \n\t"
"vmadday.xyzw ACC, vf5, vf11 \n\t"
"vmaddaz.xyzw ACC, vf6, vf11 \n\t"
"vmaddw.xyzw vf15, vf7, vf11 \n\t"
"sqc2 vf12, 0x00(%0) \n\t"
"sqc2 vf13, 0x10(%0) \n\t"
"sqc2 vf14, 0x20(%0) \n\t"
"sqc2 vf15, 0x30(%0) \n\t"
"lqc2 vf1, 0x00(%1) \n\t"
"lqc2 vf2, 0x10(%1) \n\t"
"lqc2 vf3, 0x20(%1) \n\t"
"lqc2 vf4, 0x30(%1) \n\t"
"lqc2 vf5, 0x00(%2) \n\t"
"lqc2 vf6, 0x10(%2) \n\t"
"lqc2 vf7, 0x20(%2) \n\t"
"lqc2 vf8, 0x30(%2) \n\t"
"vmulax.xyzw ACC, vf5, vf1 \n\t"
"vmadday.xyzw ACC, vf6, vf1 \n\t"
"vmaddaz.xyzw ACC, vf7, vf1 \n\t"
"vmaddw.xyzw vf1, vf8, vf1 \n\t"
"vmulax.xyzw ACC, vf5, vf2 \n\t"
"vmadday.xyzw ACC, vf6, vf2 \n\t"
"vmaddaz.xyzw ACC, vf7, vf2 \n\t"
"vmaddw.xyzw vf2, vf8, vf2 \n\t"
"vmulax.xyzw ACC, vf5, vf3 \n\t"
"vmadday.xyzw ACC, vf6, vf3 \n\t"
"vmaddaz.xyzw ACC, vf7, vf3 \n\t"
"vmaddw.xyzw vf3, vf8, vf3 \n\t"
"vmulax.xyzw ACC, vf5, vf4 \n\t"
"vmadday.xyzw ACC, vf6, vf4 \n\t"
"vmaddaz.xyzw ACC, vf7, vf4 \n\t"
"vmaddw.xyzw vf4, vf8, vf4 \n\t"
"sqc2 vf1, 0x00(%0) \n\t"
"sqc2 vf2, 0x10(%0) \n\t"
"sqc2 vf3, 0x20(%0) \n\t"
"sqc2 vf4, 0x30(%0) \n\t"
:
: "r"(this->data), "r"(this->data), "r"(t.data));
: "r"(this->data), "r"(this->data), "r"(t.data)
: "memory");
}
/** Create empty matrix */
@@ -288,38 +275,6 @@ void Matrix::setPerspective(ScreenSettings &t_screen)
this->data[15] = 0.0F;
}
void Matrix::rotationByAngle(const float &t_angle, const Vector3 &t_axis)
{
Vector3 localAxis = Vector3(t_axis);
localAxis.normalize();
float x = localAxis.x;
float y = localAxis.y;
float z = localAxis.z;
float c = Math::cos(t_angle);
float s = Math::sin(t_angle);
this->data[0] = x * x * (1 - c) + c;
this->data[1] = y * x * (1 - c) + z * s;
this->data[2] = x * z * (1 - c) - y * s;
this->data[3] = 0.0F;
this->data[4] = x * y * (1 - c) - z * s;
this->data[5] = y * y * (1 - c) + c;
this->data[6] = y * z * (1 - c) + x * s;
this->data[7] = 0.0F;
this->data[8] = x * z * (1 - c) + y * s;
this->data[9] = y * z * (1 - c) - x * s;
this->data[10] = z * z * (1 - c) + c;
this->data[11] = 0.0F;
this->data[12] = 0.0F;
this->data[13] = 0.0F;
this->data[14] = 0.0F;
this->data[15] = 1.0F;
}
/** Create a view matrix that transforms coordinates in
* such a way that the user looks at a target vector
* direction from a position vector.