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 {
281bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet    float get(uint32_t col, uint32_t row) const {
291bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet        return m[col*4 + row];
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
321bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet    void set(uint32_t col, uint32_t row, float v) {
331bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet        m[col*4 + row] = 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
511bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet    // Note: This assumes that the input vector (in) is of length 3.
523a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams    void vectorMultiply(float *v4out, const float *v3in) const;
533a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams
5487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    bool inverse();
5587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    bool inverseTranspose();
5687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void transpose();
5787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
58f47fb9b7ce529cee60ad211634bb27ed623f1098Jason Sams    void logv(const char *s) const;
5987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
6087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
6187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    void multiply(const rs_matrix4x4 *rhs) {
621bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet        loadMultiply(this, rhs);
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void rotate(float rot, float x, float y, float z) {
6587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadRotate(rot, x, y, z);
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        multiply(&tmp);
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void scale(float x, float y, float z) {
7087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadScale(x, y, z);
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        multiply(&tmp);
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    void translate(float x, float y, float z) {
7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams        Matrix4x4 tmp;
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tmp.loadTranslate(x, y, z);
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        multiply(&tmp);
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
803a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
84411f5996bccf88d5d2f8d1f003d39a8d76365244Stephen Hines#endif  // ANDROID_RS_MATRIX_4x4_H
85