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