200 lines
4.3 KiB
C
200 lines
4.3 KiB
C
/*----------------------------------------------------------------------------*/
|
|
/**
|
|
* 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 !_MSC_VER && !__clang__ && (__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
|