1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines * Copyright (C) 2009-2012 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
1787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#ifndef ANDROID_RS_MATRIX_4x4_H
1887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#define ANDROID_RS_MATRIX_4x4_H
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsType.h"
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// ---------------------------------------------------------------------------
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstruct Matrix4x4 : public rs_matrix4x4 {
28411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines    float get(uint32_t x, uint32_t y) const {
29411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines        return m[x*4 + y];
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
32411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines    void set(uint32_t x, uint32_t y, float v) {
33411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines        m[x*4 + y] = v;
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void loadIdentity();
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void load(const float *);
3887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void load(const rs_matrix4x4 *);
3987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void load(const rs_matrix3x3 *);
4087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void load(const rs_matrix2x2 *);
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void loadRotate(float rot, float x, float y, float z);
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void loadScale(float x, float y, float z);
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void loadTranslate(float x, float y, float z);
4587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void loadMultiply(const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
478ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    void loadOrtho(float l, float r, float b, float t, float n, float f);
488ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    void loadFrustum(float l, float r, float b, float t, float n, float f);
4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void loadPerspective(float fovy, float aspect, float near, float far);
508ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams
513a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams    void vectorMultiply(float *v4out, const float *v3in) const;
523a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams
5387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    bool inverse();
5487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    bool inverseTranspose();
5587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void transpose();
5687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
57f47fb9b7ce529cee60ad211634bb27ed623f1098Jason Sams    void logv(const char *s) const;
5887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
5987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
6087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void multiply(const rs_matrix4x4 *rhs) {
6187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadMultiply(this, rhs);
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        load(&tmp);
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void rotate(float rot, float x, float y, float z) {
6687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadRotate(rot, x, y, z);
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        multiply(&tmp);
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void scale(float x, float y, float z) {
7187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadScale(x, y, z);
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        multiply(&tmp);
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void translate(float x, float y, float z) {
7687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadTranslate(x, y, z);
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        multiply(&tmp);
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
813a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
85411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines#endif  // ANDROID_RS_MATRIX_4x4_H
86