379 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			379 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * Copyright (C) 2011 The Android Open Source Project
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *      http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| /** @file rs_matrix.rsh
 | |
|  *  \brief Matrix routines
 | |
|  *
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef __RS_MATRIX_RSH__
 | |
| #define __RS_MATRIX_RSH__
 | |
| 
 | |
| /**
 | |
|  * Set one element of a matrix.
 | |
|  *
 | |
|  * @param m The matrix to be set
 | |
|  * @param row
 | |
|  * @param col
 | |
|  * @param v
 | |
|  *
 | |
|  * @return void
 | |
|  */
 | |
| _RS_RUNTIME void __attribute__((overloadable))
 | |
| rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME void __attribute__((overloadable))
 | |
| rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME void __attribute__((overloadable))
 | |
| rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
 | |
| 
 | |
| /**
 | |
|  * Get one element of a matrix.
 | |
|  *
 | |
|  * @param m The matrix to read from
 | |
|  * @param row
 | |
|  * @param col
 | |
|  *
 | |
|  * @return float
 | |
|  */
 | |
| _RS_RUNTIME float __attribute__((overloadable))
 | |
| rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float __attribute__((overloadable))
 | |
| rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float __attribute__((overloadable))
 | |
| rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
 | |
| 
 | |
| /**
 | |
|  * Set the elements of a matrix to the identity matrix.
 | |
|  *
 | |
|  * @param m
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m);
 | |
| 
 | |
| /**
 | |
|  * Set the elements of a matrix from an array of floats.
 | |
|  *
 | |
|  * @param m
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v);
 | |
| 
 | |
| /**
 | |
|  * Set the elements of a matrix from another matrix.
 | |
|  *
 | |
|  * @param m
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v);
 | |
| 
 | |
| /**
 | |
|  * Load a rotation matrix.
 | |
|  *
 | |
|  * @param m
 | |
|  * @param rot
 | |
|  * @param x
 | |
|  * @param y
 | |
|  * @param z
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
 | |
| 
 | |
| /**
 | |
|  * Load a scale matrix.
 | |
|  *
 | |
|  * @param m
 | |
|  * @param x
 | |
|  * @param y
 | |
|  * @param z
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
 | |
| 
 | |
| /**
 | |
|  * Load a translation matrix.
 | |
|  *
 | |
|  * @param m
 | |
|  * @param x
 | |
|  * @param y
 | |
|  * @param z
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
 | |
| 
 | |
| /**
 | |
|  * Multiply two matrix (lhs, rhs) and place the result in m.
 | |
|  *
 | |
|  * @param m
 | |
|  * @param lhs
 | |
|  * @param rhs
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
 | |
| 
 | |
| /**
 | |
|  * Multiply the matrix m by rhs and place the result back into m.
 | |
|  *
 | |
|  * @param m (lhs)
 | |
|  * @param rhs
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
 | |
| 
 | |
| /**
 | |
|  * Multiple matrix m with a rotation matrix
 | |
|  *
 | |
|  * @param m
 | |
|  * @param rot
 | |
|  * @param x
 | |
|  * @param y
 | |
|  * @param z
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
 | |
| 
 | |
| /**
 | |
|  * Multiple matrix m with a scale matrix
 | |
|  *
 | |
|  * @param m
 | |
|  * @param x
 | |
|  * @param y
 | |
|  * @param z
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
 | |
| 
 | |
| /**
 | |
|  * Multiple matrix m with a translation matrix
 | |
|  *
 | |
|  * @param m
 | |
|  * @param x
 | |
|  * @param y
 | |
|  * @param z
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
 | |
| 
 | |
| /**
 | |
|  * Load an Ortho projection matrix constructed from the 6 planes
 | |
|  *
 | |
|  * @param m
 | |
|  * @param left
 | |
|  * @param right
 | |
|  * @param bottom
 | |
|  * @param top
 | |
|  * @param near
 | |
|  * @param far
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
 | |
| 
 | |
| /**
 | |
|  * Load an Frustum projection matrix constructed from the 6 planes
 | |
|  *
 | |
|  * @param m
 | |
|  * @param left
 | |
|  * @param right
 | |
|  * @param bottom
 | |
|  * @param top
 | |
|  * @param near
 | |
|  * @param far
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
 | |
| 
 | |
| /**
 | |
|  * Load an perspective projection matrix constructed from the 6 planes
 | |
|  *
 | |
|  * @param m
 | |
|  * @param fovy Field of view, in degrees along the Y axis.
 | |
|  * @param aspect Ratio of x / y.
 | |
|  * @param near
 | |
|  * @param far
 | |
|  */
 | |
| extern void __attribute__((overloadable))
 | |
| rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
 | |
| 
 | |
| #if !defined(RS_VERSION) || (RS_VERSION < 14)
 | |
| /**
 | |
|  * Multiply a vector by a matrix and return the result vector.
 | |
|  * API version 10-13
 | |
|  */
 | |
| _RS_RUNTIME float4 __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix4x4 *m, float4 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float4 __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float4 __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix4x4 *m, float2 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float3 __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix3x3 *m, float3 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float3 __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix3x3 *m, float2 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float2 __attribute__((overloadable))
 | |
| rsMatrixMultiply(rs_matrix2x2 *m, float2 in);
 | |
| #else
 | |
| /**
 | |
|  * Multiply a vector by a matrix and return the result vector.
 | |
|  * API version 14+
 | |
|  */
 | |
| _RS_RUNTIME float4 __attribute__((overloadable))
 | |
| rsMatrixMultiply(const rs_matrix4x4 *m, float4 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float4 __attribute__((overloadable))
 | |
| rsMatrixMultiply(const rs_matrix4x4 *m, float3 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float4 __attribute__((overloadable))
 | |
| rsMatrixMultiply(const rs_matrix4x4 *m, float2 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float3 __attribute__((overloadable))
 | |
| rsMatrixMultiply(const rs_matrix3x3 *m, float3 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float3 __attribute__((overloadable))
 | |
| rsMatrixMultiply(const rs_matrix3x3 *m, float2 in);
 | |
| 
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| _RS_RUNTIME float2 __attribute__((overloadable))
 | |
| rsMatrixMultiply(const rs_matrix2x2 *m, float2 in);
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Returns true if the matrix was successfully inversed
 | |
|  *
 | |
|  * @param m
 | |
|  */
 | |
| extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m);
 | |
| 
 | |
| /**
 | |
|  * Returns true if the matrix was successfully inversed and transposed.
 | |
|  *
 | |
|  * @param m
 | |
|  */
 | |
| extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m);
 | |
| 
 | |
| /**
 | |
|  * Transpose the matrix m.
 | |
|  *
 | |
|  * @param m
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m);
 | |
| /**
 | |
|  * \overload
 | |
|  */
 | |
| extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m);
 | |
| 
 | |
| 
 | |
| #endif
 |