/*
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[4] = {0};
int indxr[4] = {0};
int ipiv[4] = {0};
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;
kmMat4 tmp;
kmMat4Assign(&inv, pM);
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
没有合适的资源?快使用搜索试试~ 我知道了~
cocos2d-x游戏实例 萝莉快跑
共985个文件
h:238个
cpp:146个
png:56个
4星 · 超过85%的资源 需积分: 9 23 下载量 45 浏览量
2013-10-28
17:46:13
上传
评论
收藏 7.26MB ZIP 举报
温馨提示
Cocos2D-x权威指南 萝莉快跑(源代码),本人用xcode cocos2d-x2.0.4实现,若是使用vs2010或者更高级版本,只需要注意添加路径,即可使用。
资源推荐
资源详情
资源评论
收起资源包目录
cocos2d-x游戏实例 萝莉快跑 (985个子文件)
01cf1e62a26ffc4f0c6f098c7fbfb52101dd17 5KB
01eb271a76fdd9d1d136b8375049638a3e7aa1 6KB
021da77c4a2bbcc71ca85ecadd61eb38c09597 6KB
0220b1de7fb5818133752c7c0ae8c70b26efa4 5KB
02c19e289f1e79ef7e3b37c90e906257946346 4KB
03cd153aa6f0f8233d92fe0d265d1a42329c4c 1KB
03f2ea5b4af2e86fd4e73b81b2bff55cc12bf7 1KB
05003c774a18a606abfc6210c821f0c5e0e3e4 5KB
05b921cdbc546353c7f79d4648689939f188ad 1KB
05ffe3d612af73df65c2721a5a01ec7c584846 57B
06f8be59ad4265304d4d8043f2e46cb5639ebb 4KB
075a0870845f46093c3acbe09b7577aeb1056b 2KB
07a1357f57c20fa60695595e61ec3079272595 166B
0843d2831b260f8ef6913a853edf1a9cbbbdf2 440B
084c8cb1766dc5adef3af8c782ec648a0f6ee9 961B
087989e73943922213165616ea0b115465d3da 316B
08e7c8d19c430aab46b5746d75d98f7f8ecdda 3KB
0929a945363e04504abc219f18c39e6d6cd512 3KB
09870bdd7528ae903069211db88225cccc23df 822B
09ce029c05c0f3adc72fe0019d9af520855cdf 5KB
0ab4a98a51e347de40eeb4d94f7c1db8145bd6 4KB
0c11b6cafca46bd92e204def2064b150bf7904 4KB
0c18bd2980164a7b760d8cc7144e39b70502e0 910B
0d98c4ada95df1f23b60313359ce8218feaf3c 877B
0e403d17bd736d6a0f3001cef7abe73b0b3ae3 4KB
0e55df62252a99235a2d30ea61586b2e885f24 1KB
0e901b88749f4102701889d18c70f64a3f03e8 1KB
1136d0d8909f5547f7dd2bd62c718efbfb95c1 276B
123559349c858e89c2f25a30080fb06033794f 75B
13e67d1ded13ba1b6dbc3eaa0e1b16427ed3ce 750B
1453f4203945aaf34cec703b37664fd4670b30 2KB
1469ec9eacd0eb317344501f49a5fb40a10288 5KB
158823a6c12246f5cb1d787b36959355290507 914B
168af2ab8065024a4db4c5201e065db29f3712 362B
17439bfc79fffa7dc5cbfc23fa5ef06afc3713 2KB
176b407239daaf47b4dde0d163faca73dfe5e2 771B
1796b5d71d71341566bd3c1e28ee1014b291ed 884B
18c05872c4cdc623da5ace631409416a9a059d 1KB
19371b8fc415b71f45c35d0c7a13ea36f3a6ca 5KB
1967d48ad74b59eb8620c24acd585fbfa2a251 5KB
19e4cdb6925cf8c5fcb1bfd376e5758f6b5aef 1KB
1a0b9ec00663d7b5789a90a2b08ad25bfd8a63 1KB
1a25266a97e3283a0fdf8721d36295ee6e8c52 2KB
1b6a2fffe1a5c4e965c126ad1267e54b1b3ece 1KB
1b78d4d49c76bbd5e9ad7bc4c40696ab0c1b81 281B
1ba81133576b088f0f5321e0475fe381c9c2a9 2KB
1c261a3dc817a74d07c5f902cec5504cbaa092 9KB
1cd73abe89ff94a5134ed4bda3e2becbc1d739 412B
1cff94260bf2e26811c4d0ed2104967a3b57ee 460B
1e87d6232bcc2807b60adf829103f10bad7802 3KB
224c0518f219bb985cf436e600836d8b9af507 4KB
22dfb28af7d2c3f5e64c96993ca59c264a54ce 1KB
233311d3b1519782a924f2cdcc85a8200bcba2 1KB
23f78a2c799bb70a2be91ccf7ad574c6ff232c 1KB
242246e3bde465b2b99124ff923948649727b8 329B
24eaaece9fd98901706eb9eff86875d1985f6c 3KB
251ccd4dd0a819ac128bbe6d857ace3c73e1fe 79B
2527dbc5a16335d187cbabafdaa557b848503b 2KB
25774ed889d130ec3de547fdbd36ef6d980911 3KB
2594273d2ac29fa32fb4c52ac96ee1d700d8e1 2KB
25a52f917646fd731645b0d762642a028741dc 5KB
25cab63e2952679e54bd614a174b03f0d0408c 2KB
25cf5f6abb45e615933bc21525c3f584eef6cf 199B
26314d0d5b8cedaf2154cb85b056d0094b7d71 345B
274fb7cbc2663bbc9e0db1f57f7f262fe5d9e0 850B
27c99ba6bafcdfda9897dc477a2cb0b1404c53 1KB
27e93b98c820348d118d97f68eccd7b78c2dd8 791B
28b8fdfe1535aff2b22505186cd814846c503b 106B
29774a05c1acbe941a5c39982ca0ec5f891094 534B
29d4005f7a84c5bb9a1bf8b55747fa27640323 1KB
2bfc7857c0bde289f2285f09492d77fcc962b6 221B
2c09f6cbedd676119ad1aedec4a7a2652438c3 3KB
2d85027dc4f4e983dcd64821a731d2166f56ea 3KB
2e1a334cb60a1ea0cdc28e6c6099ccc02c4783 3KB
2eeb3d023a85899feea9d86177a1a9dfd96d97 6KB
2f8c1b67841a9fa1991ccff3072f426381881f 494B
2f92c6aeb221e9025dc98369f385932aedeb8d 266B
307c68dcd30a4ef5aaff7c2043c92a256ebf62 2KB
30f9d902d32d563358ab12b51670ceb64e08bd 5KB
30fd338083c1f5fc1c0b77c69178b5f493a264 3KB
310d0f53fa8637ccdc057e950d32df2929df87 2KB
321451fb9ab81f6c287a847177021fc44fceca 2KB
32d6d458e153b1958d6f382b36fd0859a3aa66 5KB
34a9561145b07ad8fc38bc435861fecb19ea0c 1004B
3526738d754f5868683ab8d77c45eb99623b65 3KB
360c10aa6fbc197ddf71fd76288edd0a54b1aa 2KB
3654902853ec1bbc9b06e02940c7267f42460d 955B
378de27dd609bda0223831273345ea62dfa448 344B
385796f5b755353ebc04dcde72f1ba5e059564 90B
38a663912cc8a0bbb5c466aed84f92a0bcb52d 975B
399d6a53f8472ca29d4c4d48b85fccf6ff6d09 451B
39fa57d61a3310cfb0a26cd080a753cc25b8b5 2KB
3a4cf377cff663c0a8907f7aea3b82ad51dcd3 606B
3aebbcc754b744378dc63521c531a518c57dce 2KB
3b430233f22fcadb5a3ec7fdb3fc69d96d7cd0 1KB
3b69ee35e224ec437849de30d4a670e2145b24 1KB
3b823ac701be0a9496235baec3ab6f1976db6b 4KB
3beb358ff66c2ffcde064760ce6cf945c66373 3KB
3c11664d74b1fb4da4162e0b6258655d2e4bf8 438B
3d528b3d77403f0473248b1f8bd0e4b89b2073 500B
共 985 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
- lyqf3652014-05-05xcode + ios 的 ipad模拟器,界面乱了.编译还是通过的.
- -NuNu-2014-09-21编译通过也能运行,但是UI和MapTile乱了,看看代码还是很好的。
热血枫叶
- 粉丝: 388
- 资源: 26
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功