123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- /*----------------------------------------------------------------------------*/
- /**
- * This confidential and proprietary software may be used only as
- * authorised by a licensing agreement from ARM Limited
- * (C) COPYRIGHT 2011-2012, 2018 ARM Limited
- * ALL RIGHTS RESERVED
- *
- * The entire notice above must be reproduced on all authorised
- * copies and copies may only be made to the extent permitted
- * by a licensing agreement from ARM Limited.
- *
- * @brief Internal math library declarations for ASTC codec.
- */
- /*----------------------------------------------------------------------------*/
- #ifndef MATHLIB_H_INCLUDED
- #define MATHLIB_H_INCLUDED
- #include "vectypes.h"
- // basic OpenCL functions
- float inversesqrt(float p);
- float acospi(float p);
- float sinpi(float p);
- float cospi(float p);
- float nan(int p);
- #if !defined(_MSC_VER) && (__cplusplus < 201103L)
- float fmax(float p, float q);
- float fmin(float p, float q);
- #endif // C++11
- float2 fmax(float2 p, float2 q);
- float3 fmax(float3 p, float3 q);
- float4 fmax(float4 p, float4 q);
- float2 fmin(float2 p, float2 q);
- float3 fmin(float3 p, float3 q);
- float4 fmin(float4 p, float4 q);
- /*
- float dot( float2 p, float2 q );
- float dot( float3 p, float3 q );
- float dot( float4 p, float4 q );
- */
- static inline float dot(float2 p, float2 q)
- {
- return p.x * q.x + p.y * q.y;
- }
- static inline float dot(float3 p, float3 q)
- {
- return p.x * q.x + p.y * q.y + p.z * q.z;
- }
- static inline float dot(float4 p, float4 q)
- {
- return p.x * q.x + p.y * q.y + p.z * q.z + p.w * q.w;
- }
- float3 cross(float3 p, float3 q);
- float4 cross(float4 p, float4 q);
- float length(float2 p);
- float length(float3 p);
- float length(float4 p);
- float length_sqr(float2 p);
- float length_sqr(float3 p);
- float length_sqr(float4 p);
- float distance(float2 p, float2 q);
- float distance(float3 p, float3 q);
- float distance(float4 p, float4 q);
- float distance_sqr(float2 p, float2 q);
- float distance_sqr(float3 p, float3 q);
- float distance_sqr(float4 p, float4 q);
- float2 normalize(float2 p);
- float3 normalize(float3 p);
- float4 normalize(float4 p);
- // functions other than just basic OpenCL functions
- float4 gcross(float4 p, float4 q, float4 r);
- struct mat2
- {
- float2 v[2];
- };
- struct mat3
- {
- float3 v[3];
- };
- struct mat4
- {
- float4 v[4];
- };
- float trace(mat2 p);
- float trace(mat3 p);
- float trace(mat4 p);
- float determinant(mat2 p);
- float determinant(mat3 p);
- float determinant(mat4 p);
- float2 characteristic_poly(mat2 p);
- float3 characteristic_poly(mat3 p);
- float4 characteristic_poly(mat4 p);
- float2 solve_monic(float2 p);
- float3 solve_monic(float3 p);
- float4 solve_monic(float4 p);
- float2 transform(mat2 p, float2 q);
- float3 transform(mat3 p, float3 q);
- float4 transform(mat4 p, float4 q);
- mat2 adjugate(mat2 p);
- mat3 adjugate(mat3 p);
- mat4 adjugate(mat4 p);
- mat2 invert(mat2 p);
- mat3 invert(mat3 p);
- mat4 invert(mat4 p);
- float2 eigenvalues(mat2 p);
- float3 eigenvalues(mat3 p);
- float4 eigenvalues(mat4 p);
- float2 eigenvector(mat2 p, float eigvl);
- float3 eigenvector(mat3 p, float eigvl);
- float4 eigenvector(mat4 p, float eigvl);
- mat2 operator *(mat2 a, mat2 b);
- mat3 operator *(mat3 a, mat3 b);
- mat4 operator *(mat4 a, mat4 b);
- // parametric line, 2D: The line is given by line = a + b*t.
- struct line2
- {
- float2 a;
- float2 b;
- };
- // parametric line, 3D
- struct line3
- {
- float3 a;
- float3 b;
- };
- struct line4
- {
- float4 a;
- float4 b;
- };
- // plane/hyperplane defined by a point and a normal vector
- struct plane_3d
- {
- float3 root_point;
- float3 normal; // normalized
- };
- struct hyperplane_4d
- {
- float4 root_point;
- float4 normal; // normalized
- };
- float param_nearest_on_line(float2 point, line2 line);
- float param_nearest_on_line(float3 point, line3 line);
- float param_nearest_on_line(float4 point, line4 line);
- float point_line_distance(float2 point, line2 line);
- float point_line_distance(float3 point, line3 line);
- float point_line_distance(float4 point, line4 line);
- float point_line_distance_sqr(float2 point, line2 line);
- float point_line_distance_sqr(float3 point, line3 line);
- float point_line_distance_sqr(float4 point, line4 line);
- float point_plane_3d_distance(float3 point, plane_3d plane);
- float point_hyperplane_4d_distance(float4 point, hyperplane_4d plane);
- plane_3d generate_plane_from_points(float3 point0, float3 point1, float3 point2);
- hyperplane_4d generate_hyperplane_from_points(float4 point0, float4 point1, float4 point2, float4 point3);
- #endif
|