/*
Copyright (c) 2008, Luke Benstead.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file mat4.c
*/
#include <memory.h>
#include <assert.h>
#include <stdlib.h>
#include "kazmath/utility.h"
#include "kazmath/vec3.h"
#include "kazmath/mat4.h"
#include "kazmath/mat3.h"
#include "kazmath/quaternion.h"
#include "kazmath/plane.h"
#include "kazmath/neon_matrix_impl.h"
/**
* Fills a kmMat4 structure with the values from a 16
* element array of floats
* @Params pOut - A pointer to the destination matrix
* pMat - A 16 element array of floats
* @Return Returns pOut so that the call can be nested
*/
kmMat4* const kmMat4Fill(kmMat4* pOut, const kmScalar* pMat)
{
memcpy(pOut->mat, pMat, sizeof(kmScalar) * 16);
return pOut;
}
/**
* Sets pOut to an identity matrix returns pOut
* @Params pOut - A pointer to the matrix to set to identity
* @Return Returns pOut so that the call can be nested
*/
kmMat4* const kmMat4Identity(kmMat4* pOut)
{
memset(pOut->mat, 0, sizeof(float) * 16);
pOut->mat[0] = pOut->mat[5] = pOut->mat[10] = pOut->mat[15] = 1.0f;
return pOut;
}
float get(const kmMat4 * pIn, int row, int col)
{
return pIn->mat[row + 4*col];
}
void set(kmMat4 * pIn, int row, int col, float value)
{
pIn->mat[row + 4*col] = value;
}
void swap(kmMat4 * pIn, int r1, int c1, int r2, int c2)
{
float tmp = get(pIn,r1,c1);
set(pIn,r1,c1,get(pIn,r2,c2));
set(pIn,r2,c2, tmp);
}
//Returns an upper and a lower triangular matrix which are L and R in the Gauss algorithm
int gaussj(kmMat4 *a, kmMat4 *b)
{
int i, icol = 0, irow = 0, j, k, l, ll, n = 4, m = 4;
float big, dum, pivinv;
int indxc[n];
int indxr[n];
int ipiv[n];
for (j = 0; j < n; j++) {
ipiv[j] = 0;
}
for (i = 0; i < n; i++) {
big = 0.0f;
for (j = 0; j < n; j++) {
if (ipiv[j] != 1) {
for (k = 0; k < n; k++) {
if (ipiv[k] == 0) {
if (abs(get(a,j, k)) >= big) {
big = abs(get(a,j, k));
irow = j;
icol = k;
}
}
}
}
}
++(ipiv[icol]);
if (irow != icol) {
for (l = 0; l < n; l++) {
swap(a,irow, l, icol, l);
}
for (l = 0; l < m; l++) {
swap(b,irow, l, icol, l);
}
}
indxr[i] = irow;
indxc[i] = icol;
if (get(a,icol, icol) == 0.0) {
return KM_FALSE;
}
pivinv = 1.0f / get(a,icol, icol);
set(a,icol, icol, 1.0f);
for (l = 0; l < n; l++) {
set(a,icol, l, get(a,icol, l) * pivinv);
}
for (l = 0; l < m; l++) {
set(b,icol, l, get(b,icol, l) * pivinv);
}
for (ll = 0; ll < n; ll++) {
if (ll != icol) {
dum = get(a,ll, icol);
set(a,ll, icol, 0.0f);
for (l = 0; l < n; l++) {
set(a,ll, l, get(a,ll, l) - get(a,icol, l) * dum);
}
for (l = 0; l < m; l++) {
set(b,ll, l, get(a,ll, l) - get(b,icol, l) * dum);
}
}
}
}
// This is the end of the main loop over columns of the reduction. It only remains to unscram-
// ble the solution in view of the column interchanges. We do this by interchanging pairs of
// columns in the reverse order that the permutation was built up.
for (l = n - 1; l >= 0; l--) {
if (indxr[l] != indxc[l]) {
for (k = 0; k < n; k++) {
swap(a,k, indxr[l], k, indxc[l]);
}
}
}
return KM_TRUE;
}
/**
* Calculates the inverse of pM and stores the result in
* pOut.
* @Return Returns NULL if there is no inverse, else pOut
*/
kmMat4* const kmMat4Inverse(kmMat4* pOut, const kmMat4* pM)
{
kmMat4 inv;
kmMat4Assign(&inv, pM);
kmMat4 tmp;
kmMat4Identity(&tmp);
if(gaussj(&inv, &tmp) == KM_FALSE) {
return NULL;
}
kmMat4Assign(pOut, &inv);
return pOut;
}
/**
* Returns KM_TRUE if pIn is an identity matrix
* KM_FALSE otherwise
*/
const int kmMat4IsIdentity(const kmMat4* pIn)
{
static const float identity [] = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
};
return (memcmp(identity, pIn->mat, sizeof(float) * 16) == 0);
}
/**
* Sets pOut to the transpose of pIn, returns pOut
*/
kmMat4* const kmMat4Transpose(kmMat4* pOut, const kmMat4* pIn)
{
int x, z;
for (z = 0; z < 4; ++z) {
for (x = 0; x < 4; ++x) {
pOut->mat[(z * 4) + x] = pIn->mat[(x * 4) + z];
}
}
return pOut;
}
/**
* Multiplies pM1 with pM2, stores the result in pOut, returns pOut
*/
kmMat4* const kmMat4Multiply(kmMat4* pOut, const kmMat4* pM1, const kmMat4* pM2)
{
#if defined(__ARM_NEON__)
float mat[16];
// Invert column-order with row-order
NEON_Matrix4Mul( &pM2->mat[0], &pM1->mat[0], &mat[0] );
#else
float mat[16];
const float *m1 = pM1->mat, *m2 = pM2->mat;
mat[0] = m1[0] * m2[0] + m1[4] * m2[1] + m1[8] * m2[2] + m1[12] * m2[3];
mat[1] = m1[1] * m2[0] + m1[5] * m2[1] + m1[9] * m2[2] + m1[13] * m2[3];
mat[2] = m1[2] * m2[0] + m1[6] * m2[1] + m1[10] * m2[2] + m1[14] * m2[3];
mat[3] = m1[3] * m2[0] + m1[7] * m2[1] + m1[11] * m2[2] + m1[15] * m2[3];
mat[4] = m1[0] * m2[4] + m1[4] * m2[5] + m1[8] * m2[6] + m1[12] * m2[7];
mat[5] = m1[1] * m2[4] + m1[5] * m2[5] + m1[9] * m2[6] + m1[13] * m2[7];
mat[6] = m1[2] * m2[4] + m1[6] * m2[5] + m1[10] * m2[6] + m1[14] * m2[7];
mat[7] = m1[3] * m2[4] + m1[7] * m2[5] + m1[11] * m2[6] + m1[15] * m2[7];
mat[8] = m1[0] * m2[8] + m1[4] * m2[9] + m1[8] * m2[10] + m1[12] * m2[11];
mat[9] = m1[1] * m2[8] + m1[5] * m2[9] + m1[9] * m2[10] + m1[13] * m2[11];
mat[10] = m1[2] * m2[8] + m1[6] * m2[9] + m1[10] * m2[10] + m1[14] * m2[11];
mat[11] = m1[3] * m2[8] + m1[7] * m2[9] + m1[11] * m2[10] + m1[15] * m2[11];
mat[12] = m1[0] * m2[12] + m1[4] * m2[13] + m1[8] * m2[14] + m1[12] * m2[15];
mat[13] = m1[1] * m2[12] + m1[5] * m2[13] + m1[9] * m2[14] + m1[13] * m2[15];
mat[14] = m1[2] * m2[12] + m1[6] * m2[13] + m1[10] * m2[14] + m1[14] * m2[15];
mat[15] = m1[3] * m2[12] + m1[7] * m2[13] + m1[11] * m2[14] + m1[15] * m2[15];
#endif
memcpy(pOut->mat, mat, sizeof(float)*16);
return pOut;
}
/**
* Assigns the value of pIn to pOut
*/
kmMat4* const kmMat4Assign(kmMat4* pOut, const kmMat4* pIn)
{
assert(pOut != pIn && "You have tried to self-assi
没有合适的资源?快使用搜索试试~ 我知道了~
IOS应用源码之仿合金弹头ios游戏源码 .rar
共2000个文件
png:1922个
h:276个
m:196个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 12 浏览量
2022-07-09
10:37:25
上传
评论
收藏 6.2MB RAR 举报
温馨提示
IOS应用源码之仿合金弹头ios游戏源码 .rar
资源推荐
资源详情
资源评论
收起资源包目录
IOS应用源码之仿合金弹头ios游戏源码 .rar (2000个子文件)
008ba27699337b53aa515d2810824a4e538fa5 1KB
0284fc0224f481890ec8111f739812ef6927e1 1KB
02e3ccba2bca3d619cb7bac36d2700c2d46056 2KB
032f49bc4098eac5248857ff349bbe2a41dbc9 4KB
034a98fb3d98968af47aa19a8aaa12a497605b 928B
04151202bd09a176ad0b29ade75c0040ecfc51 1KB
0486cd06768771d0b7a84b39a8e5a8990ac7a9 2KB
050ff0a866c1121331e498e2e21e89cb4b7685 5KB
058d9445e9c60156c61d4a254a4b124e85d3cc 2KB
0735966ae1aa6105a0225c2530d2818344c913 3KB
07ea3cbc1d993ef1394f06e8f67ff2cd524bbd 1KB
086c655a555d4609c4e5810abb5ff015f8e36f 905B
08a49d1fb54a57698ab47f3d3e656c3aef9a61 1KB
08b439ef0be2c73e027628976307977d95616f 1KB
09870bdd7528ae903069211db88225cccc23df 822B
0a40d446083973a037ce8b8978eb8170b90168 198B
0aa93934a537e926d54facea52e4e5f56e8939 3KB
0def38e1d8a6061da9a6521f108611d34931b7 2KB
0e7b5b4fe1416c07dd5097ddd0f0bdc4014e46 2KB
0effa191ab1daa694f549185d807101a956620 1KB
0f4896a4c2ce91f85c0d66e497ff5cbf97b7ef 4KB
0f7715fe8a7051c3c7db1b5b2c3d8dc9891725 1KB
0fe259874cc846734f1814264ae2eb5757d159 3KB
1031b4e717928d668f028478aac85532af0219 5KB
114bc29a179c6445f6e094519ac148595aade4 2KB
11669597845b9ad3577ea779ad2319a10f5cc5 5KB
12542147d4f0671a866e3b803a08a5b5def6ea 1KB
13ef00b3a3daf5881462688c43e80695c4e80c 2KB
150bd50af3726d776dd26459b977d6684af7c0 2KB
1525bb21145a473e27e738d4a5863686c444ad 4KB
163332e923fb94f2d7839bac8f39fc031b00e4 2KB
168a8404a7d82a9334b9aaa8bee59b107f9716 3KB
16933bfe27820184b5819161cc4a7a15893acb 3KB
16e19814e83b2ab28b001967ec3b3b6bda3d6c 927B
17b2e36e067e70325047304de394a4ac22b0b7 2KB
18913f0b82d53ca2a4dc6c71367fbf7a6b2ad1 2KB
18db0b67d224da8647825cf6b18740354e753d 2KB
19d722a012b413fcd331a86eabcbf40b4fbaab 1KB
1b2513fc5653a989a5d834fd22fa012e27cc50 2KB
1ba380bb9cb9211edcf76f0139b2d05eebbc39 244B
1c40ea915039fc8f029fe2dd93f83d5d1dffca 2KB
1ce47ad2cdad2bf3829b279ae371bdd1d86d78 11KB
1cf833a43adb780806ffc983021f5704e94053 3KB
1ea54f5cd93dc1dd70eb7b2caa48eb69d52336 2KB
1f0c52f639c4ca6e0423eff2135861e831081a 8KB
1f4f1587d14b2d2152814257ebda77323d021d 3KB
1f70cf8e9c7e1ad506c80058a6a277ae07ab1c 8KB
1ff63acc0bae076c149f4968de1d786214ad09 932B
2090013e2e594235ae3f248a8906bc16fb344b 2KB
226a144cd161dc2457800bb79926520e741dc6 2KB
22d794d9f3a1c237675d9a4ddd47c221a7bdd6 163B
2361deb631ac4ff6b9c2b109ce6bb1e884535a 259B
2501f0e6c2b677bfbd262fd79a6e830283b2d1 822B
282f7636b2d9a44290d01382b3358e26579f26 4KB
284890953d92703cf5d260e2d7876d514e85a8 151B
28cbb8baa6fcfae652d526b36e0f23de4f2a63 165B
28e4954abae93342bfee819c5cc210de922f89 2KB
28e50f9c6a84b3e5f26ec1c41e2b19efe95b33 6KB
2a2a501b5d3e08a8ffa34b8f60e84b52eb890c 594B
2b3c41437c23d8b8461e5371f6eb67b3dd2d54 206B
3059646b209441140a8be30227f162d3407bb4 135B
30bdb5afafdbd788d5d479971678a144ffc228 4KB
30d1abf252067f3dd1c098bf836a7b7980c058 83B
334a35cdcdbf3803d76c15d746f6093af32ea4 1KB
34f142fa9407163626bc6cb50cec2ffb10791a 170B
351614a7ef370f8037b931e179ffbf4e5db51d 657B
365346792b2aa0237c6d7e8fa0210cff2224ed 3KB
365e4e7d99f3abcb39796624449d979dcb14ec 1KB
36ff0f916abdedbee861f4808a5250fbf1c08b 209B
37bbad93340ed8135371fd0c8564a0df805052 13KB
37c969e5a754d9379ae5f472c192e6327c2a69 4KB
37d4dc1bed06824346a89c87a5232d1147247a 931B
38b594c282a5bbbb8e6dbc613f824774e32edb 5KB
3934cbc21a46901134311f4dbf23b8c03a2b25 1KB
396be7f6c7d43b7ccd579900a931aaa09badf1 980B
3b38da7f902e2480f61b8615feb73ce2e30905 4KB
3b823ac701be0a9496235baec3ab6f1976db6b 4KB
3b87832ff9a29d3317709c987466fc542937da 3KB
3c5e85ae146715c9358d2d2cbec2538043854d 329B
3cf14950461cc0762da7805aa05a5356dda744 2KB
3d824eefe9b0df5eee63e599e106d66b54805c 49B
3e253dcd45adc2d5f0700cd516116ad0947653 5KB
3eac39e6675b3dcdb1401a9d0d252963ab304a 1KB
3f86d52f7c7168fb9b90e8aeede7e81dfd3da0 927B
3fee36abe280488110ad0511ecf280770e32bd 1KB
4187c63ca36777ddb72800e08ad63bedb2e4d7 2KB
42e461081b7bbef43eb0aae7477367de9f83a6 2KB
43a3fa292f3aa49493dd516a1cbab3e9ecfa2e 2KB
449025bf1076b32c129f3623cba0500a447dd0 7KB
4493288907cccf0a79bd1e3bbd461a99fbbeae 257B
468759d4368b71b2bc72ec755f62f2dd76e9af 2KB
4752f8d3db2320f589ec819795c7b83b0e38a1 1KB
478d86d5802d11b5b9b6386fb4039fc40c2db3 8KB
47c5e43d450f63d8edae17f91eabd9323b5a1d 4KB
47caa5656086153d43cb4615bcf2bf5efa835f 3KB
48972d45a36438fc4eb54a8d4f2b4cfb811aae 1KB
4b0c65806630d7835561a28e0f3852e0d83dd1 5KB
4c4fa964bdded35e931cca8e83c734f71bee17 282B
4ee79ff8fd3e66570a193d43c830f08aeecac5 2KB
510c4d0b87643e80fd43af5fb351b1a206176e 3KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
- 2301_761916232024-03-22感谢资源主的分享,这个资源对我来说很有用,内容描述详尽,值得借鉴。
reg183
- 粉丝: 1811
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功