• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2009 The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  #include "rsMatrix.h"
18  
19  #include "stdlib.h"
20  #include "string.h"
21  #include "math.h"
22  
23  using namespace android;
24  using namespace android::renderscript;
25  
26  
27  
loadIdentity()28  void Matrix::loadIdentity()
29  {
30      set(0, 0, 1);
31      set(1, 0, 0);
32      set(2, 0, 0);
33      set(3, 0, 0);
34  
35      set(0, 1, 0);
36      set(1, 1, 1);
37      set(2, 1, 0);
38      set(3, 1, 0);
39  
40      set(0, 2, 0);
41      set(1, 2, 0);
42      set(2, 2, 1);
43      set(3, 2, 0);
44  
45      set(0, 3, 0);
46      set(1, 3, 0);
47      set(2, 3, 0);
48      set(3, 3, 1);
49  }
50  
load(const float * v)51  void Matrix::load(const float *v)
52  {
53      memcpy(m, v, sizeof(m));
54  }
55  
load(const Matrix * v)56  void Matrix::load(const Matrix *v)
57  {
58      memcpy(m, v->m, sizeof(m));
59  }
60  
loadRotate(float rot,float x,float y,float z)61  void Matrix::loadRotate(float rot, float x, float y, float z)
62  {
63      float c, s;
64      m[3] = 0;
65      m[7] = 0;
66      m[11]= 0;
67      m[12]= 0;
68      m[13]= 0;
69      m[14]= 0;
70      m[15]= 1;
71      rot *= float(M_PI / 180.0f);
72      c = cosf(rot);
73      s = sinf(rot);
74  
75      const float len = sqrtf(x*x + y*y + z*z);
76      if (!(len != 1)) {
77          const float recipLen = 1.f / len;
78          x *= recipLen;
79          y *= recipLen;
80          z *= recipLen;
81      }
82      const float nc = 1.0f - c;
83      const float xy = x * y;
84      const float yz = y * z;
85      const float zx = z * x;
86      const float xs = x * s;
87      const float ys = y * s;
88      const float zs = z * s;
89      m[ 0] = x*x*nc +  c;
90      m[ 4] =  xy*nc - zs;
91      m[ 8] =  zx*nc + ys;
92      m[ 1] =  xy*nc + zs;
93      m[ 5] = y*y*nc +  c;
94      m[ 9] =  yz*nc - xs;
95      m[ 2] =  zx*nc - ys;
96      m[ 6] =  yz*nc + xs;
97      m[10] = z*z*nc +  c;
98  }
99  
loadScale(float x,float y,float z)100  void Matrix::loadScale(float x, float y, float z)
101  {
102      loadIdentity();
103      m[0] = x;
104      m[5] = y;
105      m[10] = z;
106  }
107  
loadTranslate(float x,float y,float z)108  void Matrix::loadTranslate(float x, float y, float z)
109  {
110      loadIdentity();
111      m[12] = x;
112      m[13] = y;
113      m[14] = z;
114  }
115  
loadMultiply(const Matrix * lhs,const Matrix * rhs)116  void Matrix::loadMultiply(const Matrix *lhs, const Matrix *rhs)
117  {
118      for (int i=0 ; i<4 ; i++) {
119          float ri0 = 0;
120          float ri1 = 0;
121          float ri2 = 0;
122          float ri3 = 0;
123          for (int j=0 ; j<4 ; j++) {
124              const float rhs_ij = rhs->get(i,j);
125              ri0 += lhs->get(j,0) * rhs_ij;
126              ri1 += lhs->get(j,1) * rhs_ij;
127              ri2 += lhs->get(j,2) * rhs_ij;
128              ri3 += lhs->get(j,3) * rhs_ij;
129          }
130          set(i,0, ri0);
131          set(i,1, ri1);
132          set(i,2, ri2);
133          set(i,3, ri3);
134      }
135  }
136  
loadOrtho(float l,float r,float b,float t,float n,float f)137  void Matrix::loadOrtho(float l, float r, float b, float t, float n, float f) {
138      loadIdentity();
139      m[0] = 2 / (r - l);
140      m[5] = 2 / (t - b);
141      m[10]= -2 / (f - n);
142      m[12]= -(r + l) / (r - l);
143      m[13]= -(t + b) / (t - b);
144      m[14]= -(f + n) / (f - n);
145  }
146  
loadFrustum(float l,float r,float b,float t,float n,float f)147  void Matrix::loadFrustum(float l, float r, float b, float t, float n, float f) {
148      loadIdentity();
149      m[0] = 2 * n / (r - l);
150      m[5] = 2 * n / (t - b);
151      m[8] = (r + l) / (r - l);
152      m[9] = (t + b) / (t - b);
153      m[10]= -(f + n) / (f - n);
154      m[11]= -1;
155      m[14]= -2*f*n / (f - n);
156      m[15]= 0;
157  }
158  
vectorMultiply(float * out,const float * in) const159  void Matrix::vectorMultiply(float *out, const float *in) const {
160      out[0] = (m[0] * in[0]) + (m[4] * in[1]) + (m[8] * in[2]) + m[12];
161      out[1] = (m[1] * in[0]) + (m[5] * in[1]) + (m[9] * in[2]) + m[13];
162      out[2] = (m[2] * in[0]) + (m[6] * in[1]) + (m[10] * in[2]) + m[14];
163      out[3] = (m[3] * in[0]) + (m[7] * in[1]) + (m[11] * in[2]) + m[15];
164  }
165