matrix.cpp revision d914215edf600f811f7ad8cad2eab9049cf859a4
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/matrix.cpp 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License. 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "fp.h" 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "vertex.h" 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "light.h" 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(__arm__) && defined(__thumb__) 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#warning "matrix.cpp should not be compiled in thumb on ARM." 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define I(_i, _j) ((_j)+ 4*(_i)) 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const GLfloat gIdentityf[16] = { 1,0,0,0, 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0,1,0,0, 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0,0,1,0, 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0,0,0,1 }; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const matrixx_t gIdentityx = { 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 0x10000,0,0,0, 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0,0x10000,0,0, 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0,0,0x10000,0, 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 0,0,0,0x10000 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void point2__nop(transform_t const*, vec4_t* c, vec4_t const* o); 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void point3__nop(transform_t const*, vec4_t* c, vec4_t const* o); 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void point4__nop(transform_t const*, vec4_t* c, vec4_t const* o); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void normal__nop(transform_t const*, vec4_t* c, vec4_t const* o); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void point2__generic(transform_t const*, vec4_t* c, vec4_t const* o); 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void point3__generic(transform_t const*, vec4_t* c, vec4_t const* o); 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void point4__generic(transform_t const*, vec4_t* c, vec4_t const* o); 5869ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopianstatic void point4__mvui(transform_t const*, vec4_t* c, vec4_t const* o); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_init_matrix(ogles_context_t* c) 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.modelview.init(OGLES_MODELVIEW_STACK_DEPTH); 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.projection.init(OGLES_PROJECTION_STACK_DEPTH); 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.texture[i].init(OGLES_TEXTURE_STACK_DEPTH); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current = &c->transforms.modelview; 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.matrixMode = GL_MODELVIEW; 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.dirty = transform_state_t::VIEWPORT | 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::MVUI | 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::MVIT | 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::MVP; 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.mvp.loadIdentity(); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.mvp4.loadIdentity(); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.mvit4.loadIdentity(); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.mvui.loadIdentity(); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.vpt.loadIdentity(); 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.vpt.zNear = 0.0f; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.vpt.zFar = 1.0f; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_uninit_matrix(ogles_context_t* c) 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.modelview.uninit(); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.projection.uninit(); 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.texture[i].uninit(); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void validate_perspective(ogles_context_t* c, vertex_t* v) 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t enables = c->rasterizer.state.enables; 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective = (c->clipPlanes.enable) ? 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_vertex_clipAllPerspective3D : ogles_vertex_perspective3D; 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_FOG)) { 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective = ogles_vertex_perspective3DZ; 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->clipPlanes.enable || (enables&GGL_ENABLE_FOG)) 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective = ogles_vertex_clipAllPerspective3DZ; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((c->arrays.vertex.size != 4) && 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (c->transforms.mvp4.flags & transform_t::FLAGS_2D_PROJECTION)) { 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective = ogles_vertex_perspective2D; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective(c, v); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_invalidate_perspective(ogles_context_t* c) 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective = validate_perspective; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_validate_transform_impl(ogles_context_t* c, uint32_t want) 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int dirty = c->transforms.dirty & want; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Validate the modelview 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::MODELVIEW) { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.modelview.validate(); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Validate the projection stack (in fact, it's never needed) 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::PROJECTION) { 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.projection.validate(); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Validate the viewport transformation 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::VIEWPORT) { 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vp_transform_t& vpt = c->transforms.vpt; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vpt.transform.matrix.load(vpt.matrix); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vpt.transform.picker(); 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We need to update the mvp (used to transform each vertex) 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::MVP) { 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.update_mvp(); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // invalidate perspective (divide by W) and view volume clipping 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_invalidate_perspective(c); 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Validate the mvui (for normal transformation) 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::MVUI) { 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.update_mvui(); 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_invalidate_lighting_mvui(c); 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Validate the texture stack 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::TEXTURE) { 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0; i<GGL_TEXTURE_UNIT_COUNT ; i++) 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.texture[i].validate(); 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Validate the mvit4 (user-clip planes) 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & transform_state_t::MVIT) { 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.update_mvit(); 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.dirty &= ~want; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark transform_t 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_t::loadIdentity() { 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix = gIdentityx; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags = 0; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops = OP_IDENTITY; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project point2 = point2__nop; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project point3 = point3__nop; 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project point4 = point4__nop; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint notZero(GLfixed v) { 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return abs(v) & ~0x3; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint notOne(GLfixed v) { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return notZero(v - 0x10000); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_t::picker() 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* const m = matrix.m; 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // XXX: picker needs to be smarter 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags = 0; 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops = OP_ALL; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project point2 = point2__generic; 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project point3 = point3__generic; 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project point4 = point4__generic; 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // find out if this is a 2D projection 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(notZero(m[3]) | notZero(m[7]) | notZero(m[11]) | notOne(m[15]))) { 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags |= FLAGS_2D_PROJECTION; 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid mvui_transform_t::picker() 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project flags = 0; 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops = OP_ALL; 21269ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian point3 = point4__mvui; 21369ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian point4 = point4__mvui; 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_t::dump(const char* what) 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed const * const m = matrix.m; 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("%s:", what); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<4 ; i++) 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("[%08x %08x %08x %08x] [%f %f %f %f]\n", 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[I(0,i)], m[I(1,i)], m[I(2,i)], m[I(3,i)], 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(m[I(0,i)]), 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(m[I(1,i)]), 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(m[I(2,i)]), 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(m[I(3,i)])); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark matrixx_t 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixx_t::load(const matrixf_t& rhs) { 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed* xp = m; 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat const* fp = rhs.elements(); 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project unsigned int i = 16; 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat f = *fp++; 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *xp++ = isZerof(f) ? 0 : gglFloatToFixed(f); 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--i); 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark matrixf_t 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::multiply(matrixf_t& r, const matrixf_t& lhs, const matrixf_t& rhs) 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat const* const m = lhs.m; 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<4 ; i++) { 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project register const float rhs_i0 = rhs.m[ I(i,0) ]; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project register float ri0 = m[ I(0,0) ] * rhs_i0; 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project register float ri1 = m[ I(0,1) ] * rhs_i0; 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project register float ri2 = m[ I(0,2) ] * rhs_i0; 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project register float ri3 = m[ I(0,3) ] * rhs_i0; 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int j=1 ; j<4 ; j++) { 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project register const float rhs_ij = rhs.m[ I(i,j) ]; 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ri0 += m[ I(j,0) ] * rhs_ij; 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ri1 += m[ I(j,1) ] * rhs_ij; 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ri2 += m[ I(j,2) ] * rhs_ij; 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ri3 += m[ I(j,3) ] * rhs_ij; 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r.m[ I(i,0) ] = ri0; 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r.m[ I(i,1) ] = ri1; 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r.m[ I(i,2) ] = ri2; 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r.m[ I(i,3) ] = ri3; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::dump(const char* what) { 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("%s", what); 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("[ %9f %9f %9f %9f ]", m[I(0,0)], m[I(1,0)], m[I(2,0)], m[I(3,0)]); 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("[ %9f %9f %9f %9f ]", m[I(0,1)], m[I(1,1)], m[I(2,1)], m[I(3,1)]); 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("[ %9f %9f %9f %9f ]", m[I(0,2)], m[I(1,2)], m[I(2,2)], m[I(3,2)]); 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGD("[ %9f %9f %9f %9f ]", m[I(0,3)], m[I(1,3)], m[I(2,3)], m[I(3,3)]); 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::loadIdentity() { 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(m, gIdentityf, sizeof(m)); 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::set(const GLfixed* rhs) { 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project load(rhs); 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::set(const GLfloat* rhs) { 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project load(rhs); 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::load(const GLfixed* rhs) { 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat* fp = m; 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project unsigned int i = 16; 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *fp++ = fixedToFloat(*rhs++); 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--i); 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::load(const GLfloat* rhs) { 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(m, rhs, sizeof(m)); 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::load(const matrixf_t& rhs) { 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project operator = (rhs); 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::multiply(const matrixf_t& rhs) { 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t r; 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project multiply(r, *this, rhs); 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project operator = (r); 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::translate(GLfloat x, GLfloat y, GLfloat z) { 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<4 ; i++) { 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[12+i] += m[i]*x + m[4+i]*y + m[8+i]*z; 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::scale(GLfloat x, GLfloat y, GLfloat z) { 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<4 ; i++) { 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[ i] *= x; 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[4+i] *= y; 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[8+i] *= z; 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrixf_t::rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z) 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t rotation; 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat* r = rotation.m; 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat c, s; 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[3] = 0; r[7] = 0; r[11]= 0; 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[12]= 0; r[13]= 0; r[14]= 0; r[15]= 1; 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project a *= GLfloat(M_PI / 180.0f); 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sincosf(a, &s, &c); 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isOnef(x) && isZerof(y) && isZerof(z)) { 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[5] = c; r[10]= c; 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[6] = s; r[9] = -s; 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[1] = 0; r[2] = 0; 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[4] = 0; r[8] = 0; 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[0] = 1; 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (isZerof(x) && isOnef(y) && isZerof(z)) { 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[0] = c; r[10]= c; 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[8] = s; r[2] = -s; 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[1] = 0; r[4] = 0; 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[6] = 0; r[9] = 0; 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[5] = 1; 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (isZerof(x) && isZerof(y) && isOnef(z)) { 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[0] = c; r[5] = c; 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[1] = s; r[4] = -s; 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[2] = 0; r[6] = 0; 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[8] = 0; r[9] = 0; 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[10]= 1; 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat len = sqrtf(x*x + y*y + z*z); 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isOnef(len)) { 360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat recipLen = reciprocalf(len); 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project x *= recipLen; 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project y *= recipLen; 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project z *= recipLen; 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat nc = 1.0f - c; 366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat xy = x * y; 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat yz = y * z; 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat zx = z * x; 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat xs = x * s; 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat ys = y * s; 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat zs = z * s; 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[ 0] = x*x*nc + c; r[ 4] = xy*nc - zs; r[ 8] = zx*nc + ys; 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[ 1] = xy*nc + zs; r[ 5] = y*y*nc + c; r[ 9] = yz*nc - xs; 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r[ 2] = zx*nc - ys; r[ 6] = yz*nc + xs; r[10] = z*z*nc + c; 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project multiply(rotation); 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark matrix_stack_t 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::init(int depth) { 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack = new matrixf_t[depth]; 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops = new uint8_t[depth]; 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project maxDepth = depth; 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth = 0; 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project dirty = 0; 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project loadIdentity(); 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::uninit() { 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete [] stack; 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete [] ops; 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::loadIdentity() { 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform.loadIdentity(); 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].loadIdentity(); 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] = OP_IDENTITY; 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::load(const GLfixed* rhs) 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(transform.matrix.m, rhs, sizeof(transform.matrix.m)); 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].load(rhs); 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] = OP_ALL; // TODO: we should look at the matrix 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::load(const GLfloat* rhs) 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].load(rhs); 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] = OP_ALL; // TODO: we should look at the matrix 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::multiply(const matrixf_t& rhs) 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].multiply(rhs); 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] = OP_ALL; // TODO: we should look at the matrix 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::translate(GLfloat x, GLfloat y, GLfloat z) 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].translate(x,y,z); 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] |= OP_TRANSLATE; 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::scale(GLfloat x, GLfloat y, GLfloat z) 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].scale(x,y,z); 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (x==y && y==z) { 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] |= OP_UNIFORM_SCALE; 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] |= OP_SCALE; 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z) 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth].rotate(a,x,y,z); 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth] |= OP_ROTATE; 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid matrix_stack_t::validate() 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & DO_FLOAT_TO_FIXED) { 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform.matrix.load(top()); 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (dirty & DO_PICKER) { 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform.picker(); 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project dirty = 0; 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLint matrix_stack_t::push() 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth >= (maxDepth-1)) { 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return GL_STACK_OVERFLOW; 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack[depth+1] = stack[depth]; 463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ops[depth+1] = ops[depth]; 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth++; 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLint matrix_stack_t::pop() 469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (depth == 0) { 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return GL_STACK_UNDERFLOW; 472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depth--; 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark vp_transform_t 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vp_transform_t::loadIdentity() { 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform.loadIdentity(); 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix.loadIdentity(); 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark transform_state_t 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_state_t::invalidate() 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (matrixMode) { 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_MODELVIEW: dirty |= MODELVIEW | MVP | MVUI | MVIT; break; 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_PROJECTION: dirty |= PROJECTION | MVP; break; 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TEXTURE: dirty |= TEXTURE | MVP; break; 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project current->dirty = matrix_stack_t::DO_PICKER | 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix_stack_t::DO_FLOAT_TO_FIXED; 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_state_t::update_mvp() 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t temp_mvp; 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t::multiply(temp_mvp, projection.top(), modelview.top()); 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvp4.matrix.load(temp_mvp); 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvp4.picker(); 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mvp4.flags & transform_t::FLAGS_2D_PROJECTION) { 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the mvp matrix doesn't transform W, in this case we can 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // premultiply it with the viewport transformation. In addition to 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // being more efficient, this is also much more accurate and in fact 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // is needed for 2D drawing with a resulting 1:1 mapping. 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t mvpv; 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t::multiply(mvpv, vpt.matrix, temp_mvp); 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvp.matrix.load(mvpv); 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvp.picker(); 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvp = mvp4; 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat det22(GLfloat a, GLfloat b, GLfloat c, GLfloat d) { 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return a*d - b*c; 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat ndet22(GLfloat a, GLfloat b, GLfloat c, GLfloat d) { 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return b*c - a*d; 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid invert(GLfloat* inverse, const GLfloat* src) 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project double t; 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int i, j, k, swap; 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat tmp[4][4]; 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(inverse, gIdentityf, sizeof(gIdentityf)); 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(tmp, src, sizeof(GLfloat)*16); 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (i = 0; i < 4; i++) { 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // look for largest element in column 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project swap = i; 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (j = i + 1; j < 4; j++) { 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (fabs(tmp[j][i]) > fabs(tmp[i][i])) { 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project swap = j; 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (swap != i) { 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* swap rows. */ 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (k = 0; k < 4; k++) { 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project t = tmp[i][k]; 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tmp[i][k] = tmp[swap][k]; 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tmp[swap][k] = t; 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project t = inverse[i*4+k]; 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inverse[i*4+k] = inverse[swap*4+k]; 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inverse[swap*4+k] = t; 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project t = 1.0f / tmp[i][i]; 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (k = 0; k < 4; k++) { 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tmp[i][k] *= t; 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inverse[i*4+k] *= t; 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (j = 0; j < 4; j++) { 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (j != i) { 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project t = tmp[j][i]; 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (k = 0; k < 4; k++) { 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tmp[j][k] -= tmp[i][k]*t; 578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inverse[j*4+k] -= inverse[i*4+k]*t; 579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_state_t::update_mvit() 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat r[16]; 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat* const mv = modelview.top().elements(); 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project invert(r, mv); 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // convert to fixed-point and transpose 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed* const x = mvit4.matrix.m; 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<4 ; i++) 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int j=0 ; j<4 ; j++) 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project x[I(i,j)] = gglFloatToFixed(r[I(j,i)]); 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvit4.picker(); 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid transform_state_t::update_mvui() 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 60069ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian GLfloat r[16]; 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat* const mv = modelview.top().elements(); 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60369ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian // TODO: we need a faster invert, especially for when the modelview 60469ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian // is a rigid-body matrix 60569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian invert(r, mv); 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed* const x = mvui.matrix.m; 60869ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian for (int i=0 ; i<4 ; i++) { 60969ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian x[I(i,0)] = gglFloatToFixed(r[I(i,0)]); 61069ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian x[I(i,1)] = gglFloatToFixed(r[I(i,1)]); 61169ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian x[I(i,2)] = gglFloatToFixed(r[I(i,2)]); 61269ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian x[I(i,4)] = gglFloatToFixed(r[I(i,3)]); 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mvui.picker(); 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// transformation and matrices API 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark transformation and matrices API 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint ogles_surfaceport(ogles_context_t* c, GLint x, GLint y) 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.surfaceport.x = x; 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.surfaceport.y = y; 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(c, 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.x, 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.y, 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.w, 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.h); 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(c, 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.x, 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.y, 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.w, 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.h); 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 0; 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_scissor(ogles_context_t* c, 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint x, GLint y, GLsizei w, GLsizei h) 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((w|h) < 0) { 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.x = x; 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.y = y; 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.w = w; 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.scissor.h = h; 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project x += c->viewport.surfaceport.x; 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project y += c->viewport.surfaceport.y; 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project y = c->rasterizer.state.buffers.color.height - (y + h); 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.scissor(c, x, y, w, h); 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_viewport(ogles_context_t* c, 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint x, GLint y, GLsizei w, GLsizei h) 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((w|h)<0) { 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.x = x; 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.y = y; 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.w = w; 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->viewport.h = h; 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project x += c->viewport.surfaceport.x; 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project y += c->viewport.surfaceport.y; 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint H = c->rasterizer.state.buffers.color.height; 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat sx = div2f(w); 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat ox = sx + x; 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat sy = div2f(h); 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat oy = sy - y + (H - h); 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat near = c->transforms.vpt.zNear; 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat far = c->transforms.vpt.zFar; 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat A = div2f(far - near); 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat B = div2f(far + near); 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // compute viewport matrix 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat* const f = c->transforms.vpt.matrix.editElements(); 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[0] = sx; f[4] = 0; f[ 8] = 0; f[12] = ox; 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[1] = 0; f[5] =-sy; f[ 9] = 0; f[13] = oy; 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[2] = 0; f[6] = 0; f[10] = A; f[14] = B; 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[3] = 0; f[7] = 0; f[11] = 0; f[15] = 1; 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.dirty |= transform_state_t::VIEWPORT; 699d914215edf600f811f7ad8cad2eab9049cf859a4Martin Storsjo if (c->transforms.mvp4.flags & transform_t::FLAGS_2D_PROJECTION) 700d914215edf600f811f7ad8cad2eab9049cf859a4Martin Storsjo c->transforms.dirty |= transform_state_t::MVP; 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark matrix * vertex 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid point2__generic(transform_t const* mx, vec4_t* lhs, vec4_t const* rhs) { 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* const m = mx->matrix.m; 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rx = rhs->x; 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed ry = rhs->y; 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->x = mla2a(rx, m[ 0], ry, m[ 4], m[12]); 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->y = mla2a(rx, m[ 1], ry, m[ 5], m[13]); 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->z = mla2a(rx, m[ 2], ry, m[ 6], m[14]); 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->w = mla2a(rx, m[ 3], ry, m[ 7], m[15]); 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid point3__generic(transform_t const* mx, vec4_t* lhs, vec4_t const* rhs) { 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* const m = mx->matrix.m; 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rx = rhs->x; 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed ry = rhs->y; 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rz = rhs->z; 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->x = mla3a(rx, m[ 0], ry, m[ 4], rz, m[ 8], m[12]); 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->y = mla3a(rx, m[ 1], ry, m[ 5], rz, m[ 9], m[13]); 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->z = mla3a(rx, m[ 2], ry, m[ 6], rz, m[10], m[14]); 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->w = mla3a(rx, m[ 3], ry, m[ 7], rz, m[11], m[15]); 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid point4__generic(transform_t const* mx, vec4_t* lhs, vec4_t const* rhs) { 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* const m = mx->matrix.m; 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rx = rhs->x; 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed ry = rhs->y; 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rz = rhs->z; 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rw = rhs->w; 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->x = mla4(rx, m[ 0], ry, m[ 4], rz, m[ 8], rw, m[12]); 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->y = mla4(rx, m[ 1], ry, m[ 5], rz, m[ 9], rw, m[13]); 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->z = mla4(rx, m[ 2], ry, m[ 6], rz, m[10], rw, m[14]); 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->w = mla4(rx, m[ 3], ry, m[ 7], rz, m[11], rw, m[15]); 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 74269ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopianvoid point4__mvui(transform_t const* mx, vec4_t* lhs, vec4_t const* rhs) { 74369ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian // this used for transforming light positions back to object space. 74469ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian // Lights have 3 components positions, so w is always 1. 74569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian // however, it is used as a switch for directional lights, so we need 74669ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian // to preserve it. 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* const m = mx->matrix.m; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rx = rhs->x; 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed ry = rhs->y; 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rz = rhs->z; 75169ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian lhs->x = mla3a(rx, m[ 0], ry, m[ 4], rz, m[ 8], m[12]); 75269ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian lhs->y = mla3a(rx, m[ 1], ry, m[ 5], rz, m[ 9], m[13]); 75369ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian lhs->z = mla3a(rx, m[ 2], ry, m[ 6], rz, m[10], m[14]); 75469ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian lhs->w = rhs->w; 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid point2__nop(transform_t const*, vec4_t* lhs, vec4_t const* rhs) { 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->z = 0; 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->w = 0x10000; 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (lhs != rhs) { 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->x = rhs->x; 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->y = rhs->y; 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid point3__nop(transform_t const*, vec4_t* lhs, vec4_t const* rhs) { 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->w = 0x10000; 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (lhs != rhs) { 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->x = rhs->x; 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->y = rhs->y; 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project lhs->z = rhs->z; 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid point4__nop(transform_t const*, vec4_t* lhs, vec4_t const* rhs) { 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (lhs != rhs) 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *lhs = *rhs; 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void frustumf( 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat left, GLfloat right, 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat bottom, GLfloat top, 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat zNear, GLfloat zFar, 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c) 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (cmpf(left,right) || 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cmpf(top, bottom) || 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cmpf(zNear, zFar) || 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project isZeroOrNegativef(zNear) || 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project isZeroOrNegativef(zFar)) 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat r_width = reciprocalf(right - left); 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat r_height = reciprocalf(top - bottom); 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat r_depth = reciprocalf(zNear - zFar); 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat x = mul2f(zNear * r_width); 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat y = mul2f(zNear * r_height); 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat A = mul2f((right + left) * r_width); 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat B = (top + bottom) * r_height; 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat C = (zFar + zNear) * r_depth; 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat D = mul2f(zFar * zNear * r_depth); 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat f[16]; 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 0] = x; 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 5] = y; 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 8] = A; 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 9] = B; 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[10] = C; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[14] = D; 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[11] = -1.0f; 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 1] = f[ 2] = f[ 3] = 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 4] = f[ 6] = f[ 7] = 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[12] = f[13] = f[15] = 0.0f; 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t rhs; 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rhs.set(f); 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->multiply(rhs); 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void orthof( 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat left, GLfloat right, 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat bottom, GLfloat top, 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat zNear, GLfloat zFar, 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c) 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (cmpf(left,right) || 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cmpf(top, bottom) || 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cmpf(zNear, zFar)) 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat r_width = reciprocalf(right - left); 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat r_height = reciprocalf(top - bottom); 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat r_depth = reciprocalf(zFar - zNear); 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat x = mul2f(r_width); 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat y = mul2f(r_height); 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat z = -mul2f(r_depth); 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat tx = -(right + left) * r_width; 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat ty = -(top + bottom) * r_height; 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfloat tz = -(zFar + zNear) * r_depth; 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat f[16]; 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 0] = x; 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 5] = y; 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[10] = z; 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[12] = tx; 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[13] = ty; 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[14] = tz; 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[15] = 1.0f; 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 1] = f[ 2] = f[ 3] = 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 4] = f[ 6] = f[ 7] = 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[ 8] = f[ 9] = f[11] = 0.0f; 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t rhs; 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rhs.set(f); 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->multiply(rhs); 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void depthRangef(GLclampf zNear, GLclampf zFar, ogles_context_t* c) 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project zNear = clampToZerof(zNear > 1 ? 1 : zNear); 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project zFar = clampToZerof(zFar > 1 ? 1 : zFar); 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat* const f = c->transforms.vpt.matrix.editElements(); 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[10] = div2f(zFar - zNear); 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f[14] = div2f(zFar + zNear); 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.dirty |= transform_state_t::VIEWPORT; 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.vpt.zNear = zNear; 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.vpt.zFar = zFar; 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMatrixMode(GLenum mode) 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrix_stack_t* stack = 0; 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_MODELVIEW: 887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack = &c->transforms.modelview; 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_PROJECTION: 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack = &c->transforms.projection; 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TEXTURE: 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stack = &c->transforms.texture[c->textures.active]; 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.matrixMode = mode; 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current = stack; 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLoadIdentity() 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->loadIdentity(); // also loads the GLfixed transform 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->dirty = 0; 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLoadMatrixf(const GLfloat* m) 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->load(m); 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glLoadMatrixx(const GLfixed* m) 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->load(m); // also loads the GLfixed transform 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->dirty &= ~matrix_stack_t::DO_FLOAT_TO_FIXED; 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMultMatrixf(const GLfloat* m) 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t rhs; 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rhs.set(m); 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->multiply(rhs); 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glMultMatrixx(const GLfixed* m) 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project matrixf_t rhs; 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rhs.set(m); 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->multiply(rhs); 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPopMatrix() 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint err = c->transforms.current->pop(); 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(err)) { 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, err); 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPushMatrix() 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint err = c->transforms.current->push(); 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(err)) { 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, err); 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFrustumf( 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat left, GLfloat right, 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat bottom, GLfloat top, 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat zNear, GLfloat zFar) 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project frustumf(left, right, bottom, top, zNear, zFar, c); 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glFrustumx( 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed left, GLfixed right, 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed bottom, GLfixed top, 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed zNear, GLfixed zFar) 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project frustumf( fixedToFloat(left), fixedToFloat(right), 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(bottom), fixedToFloat(top), 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(zNear), fixedToFloat(zFar), 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c); 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glOrthof( 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat left, GLfloat right, 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat bottom, GLfloat top, 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat zNear, GLfloat zFar) 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project orthof(left, right, bottom, top, zNear, zFar, c); 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glOrthox( 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed left, GLfixed right, 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed bottom, GLfixed top, 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed zNear, GLfixed zFar) 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project orthof( fixedToFloat(left), fixedToFloat(right), 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(bottom), fixedToFloat(top), 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(zNear), fixedToFloat(zFar), 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c); 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glRotatef(GLfloat a, GLfloat x, GLfloat y, GLfloat z) 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->rotate(a, x, y, z); 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glRotatex(GLfixed a, GLfixed x, GLfixed y, GLfixed z) 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->rotate( 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(a), fixedToFloat(x), 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(y), fixedToFloat(z)); 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glScalef(GLfloat x, GLfloat y, GLfloat z) 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->scale(x, y, z); 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glScalex(GLfixed x, GLfixed y, GLfixed z) 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->scale( 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(x), fixedToFloat(y), fixedToFloat(z)); 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTranslatef(GLfloat x, GLfloat y, GLfloat z) 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->translate(x, y, z); 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTranslatex(GLfixed x, GLfixed y, GLfixed z) 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.current->translate( 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project fixedToFloat(x), fixedToFloat(y), fixedToFloat(z)); 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.invalidate(); 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glScissor(GLint x, GLint y, GLsizei w, GLsizei h) 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_scissor(c, x, y, w, h); 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glViewport(GLint x, GLint y, GLsizei w, GLsizei h) 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_viewport(c, x, y, w, h); 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDepthRangef(GLclampf zNear, GLclampf zFar) 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthRangef(zNear, zFar, c); 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDepthRangex(GLclampx zNear, GLclampx zFar) 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project depthRangef(fixedToFloat(zNear), fixedToFloat(zFar), c); 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPolygonOffsetx(GLfixed factor, GLfixed units) 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->polygonOffset.factor = factor; 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->polygonOffset.units = units; 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glPolygonOffset(GLfloat factor, GLfloat units) 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->polygonOffset.factor = gglFloatToFixed(factor); 1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->polygonOffset.units = gglFloatToFixed(units); 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLbitfield glQueryMatrixxOES(GLfixed* m, GLint* e) 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLbitfield status = 0; 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat const* f = c->transforms.current->top().elements(); 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<16 ; i++) { 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isnan(f[i]) || isinf(f[i])) { 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status |= 1<<i; 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project continue; 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project e[i] = exponent(f[i]) - 7; 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project m[i] = mantissa(f[i]); 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return status; 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1107