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