<div dir="ltr">All SupraEngine.Math matrices are also compatible with OpenGL (and Vulkan, of course). SupraEngine.Math's TMatrix3x3 and TMatrix4x4 implementation have also advanced stuff as such as lerp, nlerp, slerp interpolation method functions, decomposing (into Perspective, Translation, Scale, Skew and Rotation components), recomposing (from Perspective, Translation, Scale, Skew and Rotation components). And SupraEngine.Math have also GLSL-style and in the most cases GLSL-Function-Parameter-compatible functions as such as Cross, Dot, Normalize, FaceForward, Reflect, Refract, Clamp, Mix, Step, SmoothStep, etc.<div><br></div><div>Example usages:</div><div><br></div><div>FaceNormal := (p2 - p0).Cross(p1 - p0).Normalize; // or alternatively also: FaceNormal := Normalize(Cross(p2 - p0,p1 - p0));</div><div><div>if FaceNormal.Dot((Normals[NormalIndices[0]]+</div><div>                               Normals[NormalIndices[1]]+</div><div>                               Normals[NormalIndices[2]]).Normalize) < 0.0 then begin</div><div>   FaceNormal := -FaceNormal;</div><div>end;</div></div><div><br></div><div><div> TriangleTangent:=((p2-p0)*(uv1.v-uv0.v))-((p1-p0)*(uv2.v-uv0.v));</div><div> TriangleBitangent:=((p2-p0)*(uv1.u-uv0.u))-((p1-p0)*(uv2.u-uv0.u));</div><div> TriangleTangent:=(TriangleTangent-(TriangleNormal*TriangleTangent.Dot(TriangleNormal))).Normalize;</div><div> TriangleBitangent:=(TriangleBitangent-(TriangleNormal*TriangleBitangent.Dot(TriangleNormal))).Normalize;</div><div> if (TriangleBitangent.Cross(TriangleTangent)).Dot(TriangleNormal)<0.0 then begin</div><div>   TriangleTangent:=-TriangleTangent;</div><div>   TriangleBitangent:=-TriangleBitangent;</div><div> end;</div></div><div><br></div><div><div> Matrix := Transform.Matrix * Matrix;</div></div><div><br></div><div><div> Vector := Matrix * Vector; (like at GLSL)</div></div><div><div> Vector := Vector * Matrix; (in the other way transposed mul like at GLSL)</div></div><div><br></div><div><div> Vector := Quaternion * Vector;</div><div> Vector := Vector * Quaternion; (with the same transposed-matrix-like effect)</div><div><div><br></div><div> Vector := DualQuaternion * Vector;</div><div> Vector := Vector * DualQuaternion; (with the same transposed-matrix-like effect)</div><div><br></div><div> RightVector := <a href="http://Matrix.Right.xyz">Matrix.Right.xyz</a>;</div><div> UpVector := <a href="http://Matrix.Up.xyz">Matrix.Up.xyz</a>;</div><div> ForwardVector := <a href="http://Matrix.Forwards.xyz">Matrix.Forwards.xyz</a>;<br></div><div><div> TranslationVector := <a href="http://Matrix.Translation.xyz">Matrix.Translation.xyz</a>;</div></div><div><br></div><div> Matrix := Matrix.Normalize;</div><div><div> Matrix := Matrix.OrthoNormalize;</div></div><div><div> Matrix := Matrix.RobustOrthoNormalize;</div></div><div><br></div><div><div> Quaternion := Matrix.ToQuaternion;</div></div><div><div><br></div><div> QTangent := Matrix.ToQTangent;</div></div><div><br></div><div><div> Matrix3x3 := Matrix4x4.ToMatrix3x3;</div><div><div><br></div><div> ModelMatrix := Matrix4x4Identity;</div><div> ViewMatrix := TMatrix4x4.CreateTranslation(0.0, 0.0, -4.0);</div><div> ProjectionMatrix := TMatrix4x4.CreatePerspective(45.0, Width / Heighz, 1.0, 1024.0);</div><div> ModelViewMatrix := ModelMatrix * ViewMatrix;</div><div> InverseModelViewMatrix := ModelViewMatrix.Inverse;<br></div><div></div><div> ModelViewProjectionMatrix := ModelMatrix * ViewMatrix * ProjectionMatrix;<br></div><div><div> InverseModelViewProjectionMatrix := ModelViewMatrixProjection.Inverse;</div><div> TangentSpaceRotationMatrix := ModelViewMatrix.Inverse.Transpose;</div><div> InverseTangentSpaceRotationMatrix := TangentSpaceRotationMatrix.Transpose;<br></div><div> <br></div><div> ClipMatrix := CreateProjectionMatrixClip(ProjectionMatrix, ClipPlane);</div><div><br></div></div><div>etc.</div><div><br></div><div><br></div><div><br></div></div></div><div><br></div><div> </div><div><br></div><div><br></div><div><br><br></div></div></div><div> </div><div><br></div><div><br></div><br></div>