10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/*
20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project
30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License.
60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at
70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *
100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software
110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and
140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License.
150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */
160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_MATRIX_4x4_H
180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_MATRIX_4x4_H
190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsType.h"
210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// ---------------------------------------------------------------------------
240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android {
250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript {
260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstruct Matrix4x4 : public rs_matrix4x4 {
280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    float get(uint32_t x, uint32_t y) const {
290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        return m[x*4 + y];
300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void set(uint32_t x, uint32_t y, float v) {
330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        m[x*4 + y] = v;
340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadIdentity();
370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void load(const float *);
380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void load(const rs_matrix4x4 *);
390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void load(const rs_matrix3x3 *);
400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void load(const rs_matrix2x2 *);
410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadRotate(float rot, float x, float y, float z);
430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadScale(float x, float y, float z);
440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadTranslate(float x, float y, float z);
450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadMultiply(const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadOrtho(float l, float r, float b, float t, float n, float f);
480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadFrustum(float l, float r, float b, float t, float n, float f);
490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void loadPerspective(float fovy, float aspect, float near, float far);
500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void vectorMultiply(float *v4out, const float *v3in) const;
520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool inverse();
540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    bool inverseTranspose();
550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void transpose();
560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void logv(const char *s) const;
580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void multiply(const rs_matrix4x4 *rhs) {
610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        Matrix4x4 tmp;
620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        tmp.loadMultiply(this, rhs);
630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        load(&tmp);
640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void rotate(float rot, float x, float y, float z) {
660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        Matrix4x4 tmp;
670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        tmp.loadRotate(rot, x, y, z);
680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        multiply(&tmp);
690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void scale(float x, float y, float z) {
710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        Matrix4x4 tmp;
720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        tmp.loadScale(x, y, z);
730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        multiply(&tmp);
740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    void translate(float x, float y, float z) {
760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        Matrix4x4 tmp;
770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        tmp.loadTranslate(x, y, z);
780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines        multiply(&tmp);
790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines    }
800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines};
810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}
840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines
850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif  // ANDROID_RS_MATRIX_4x4_H
86