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