1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/vertex.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 <stdio.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h"
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "fp.h"
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "vertex.h"
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h"
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h"
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_init_vertex(ogles_context_t* c)
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->cull.enable = GL_FALSE;
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->cull.cullFace = GL_BACK;
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->cull.frontFace = GL_CCW;
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.r = 0x10000;
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.g = 0x10000;
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.b = 0x10000;
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.a = 0x10000;
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.z = 0x10000;
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_uninit_vertex(ogles_context_t* c)
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// vertex processing
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Divides a vertex clip coordinates by W
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid perspective(ogles_context_t* c, vertex_t* v, uint32_t enables)
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // [x,y,z]window = vpt * ([x,y,z]clip / clip.w)
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // [w]window = 1/w
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // With a regular projection generated by glFrustum(),
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // we have w=-z, therefore, w is in [zNear, zFar].
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Also, zNear and zFar are stricly positive,
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // and 1/w (window.w) is in [1/zFar, 1/zNear], usually this
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // means ]0, +inf[ -- however, it is always recommended
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // to use as large values as possible for zNear.
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // All in all, w is usually smaller than 1.0 (assuming
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // zNear is at least 1.0); and even if zNear is smaller than 1.0
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // values of w won't be too big.
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int32_t rw = gglRecip28(v->clip.w);
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed* const m = c->transforms.vpt.transform.matrix.m;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.w = rw;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.x = gglMulAddx(gglMulx(v->clip.x, rw, 16), m[ 0], m[12], 28);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.y = gglMulAddx(gglMulx(v->clip.y, rw, 16), m[ 5], m[13], 28);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.x = TRI_FROM_FIXED(v->window.x);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.y = TRI_FROM_FIXED(v->window.y);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (enables & GGL_ENABLE_DEPTH_TEST) {
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        v->window.z = gglMulAddx(gglMulx(v->clip.z, rw, 16), m[10], m[14], 28);
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// frustum clipping and W-divide
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid clipFrustumPerspective(ogles_context_t* c, vertex_t* v, uint32_t enables)
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // ndc = clip / W
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // window = ncd * viewport
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // clip to the view-volume
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t clip = v->flags & vertex_t::CLIP_ALL;
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed w = v->clip.w;
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (v->clip.x < -w)   clip |= vertex_t::CLIP_L;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (v->clip.x >  w)   clip |= vertex_t::CLIP_R;
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (v->clip.y < -w)   clip |= vertex_t::CLIP_B;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (v->clip.y >  w)   clip |= vertex_t::CLIP_T;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (v->clip.z < -w)   clip |= vertex_t::CLIP_N;
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (v->clip.z >  w)   clip |= vertex_t::CLIP_F;
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->flags |= clip;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->arrays.cull &= clip;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_likely(!clip)) {
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // if the vertex is clipped, we don't do the perspective
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // divide, since we don't need its window coordinates.
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        perspective(c, v, enables);
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// frustum clipping, user clipping and W-divide
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid clipAllPerspective(ogles_context_t* c, vertex_t* v, uint32_t enables)
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // compute eye coordinates
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->arrays.mv_transform(
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            &c->transforms.modelview.transform, &v->eye, &v->obj);
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->flags |= vertex_t::EYE;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // clip this vertex against each user clip plane
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t clip = 0;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int planes = c->clipPlanes.enable;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    while (planes) {
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int i = 31 - gglClz(planes);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        planes &= ~(1<<i);
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // XXX: we should have a special dot() for 2,3,4 coords vertices
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLfixed d = dot4(c->clipPlanes.plane[i].equation.v, v->eye.v);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (d < 0) {
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            clip |= 0x100<<i;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->flags |= clip;
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipFrustumPerspective(c, v, enables);
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_vertex_project(ogles_context_t* c, vertex_t* v) {
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    perspective(c, v, c->rasterizer.state.enables);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_vertex_perspective2D(ogles_context_t* c, vertex_t* v)
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // here we assume w=1.0 and the viewport transformation
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // has been applied already.
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->arrays.cull = 0;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.x = TRI_FROM_FIXED(v->clip.x);
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.y = TRI_FROM_FIXED(v->clip.y);
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.z = v->clip.z;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    v->window.w = v->clip.w << 12;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_vertex_perspective3DZ(ogles_context_t* c, vertex_t* v) {
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipFrustumPerspective(c, v, GGL_ENABLE_DEPTH_TEST);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_vertex_perspective3D(ogles_context_t* c, vertex_t* v) {
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipFrustumPerspective(c, v, 0);
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_vertex_clipAllPerspective3DZ(ogles_context_t* c, vertex_t* v) {
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipAllPerspective(c, v, GGL_ENABLE_DEPTH_TEST);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_vertex_clipAllPerspective3D(ogles_context_t* c, vertex_t* v) {
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipAllPerspective(c, v, 0);
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipPlanex(GLenum plane, const GLfixed* equ, ogles_context_t* c)
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const int p = plane - GL_CLIP_PLANE0;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (ggl_unlikely(uint32_t(p) > (GL_CLIP_PLANE5 - GL_CLIP_PLANE0))) {
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ogles_error(c, GL_INVALID_ENUM);
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    vec4_t& equation = c->clipPlanes.plane[p].equation;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    memcpy(equation.v, equ, sizeof(vec4_t));
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_validate_transform(c, transform_state_t::MVIT);
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    transform_t& mvit = c->transforms.mvit4;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mvit.point4(&mvit, &equation, &equation);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a)
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.r       = gglFloatToFixed(r);
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.r = gglClampx(c->current.color.r);
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.g       = gglFloatToFixed(g);
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.g = gglClampx(c->current.color.g);
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.b       = gglFloatToFixed(b);
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.b = gglClampx(c->current.color.b);
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.a       = gglFloatToFixed(a);
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.a = gglClampx(c->current.color.a);
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glColor4x(GLfixed r, GLfixed g, GLfixed b, GLfixed a)
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.r = r;
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.g = g;
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.b = b;
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->current.color.a = a;
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.r = gglClampx(r);
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.g = gglClampx(g);
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.b = gglClampx(b);
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentColorClamped.a = gglClampx(a);
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glNormal3f(GLfloat x, GLfloat y, GLfloat z)
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.x = gglFloatToFixed(x);
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.y = gglFloatToFixed(y);
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.z = gglFloatToFixed(z);
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glNormal3x(GLfixed x, GLfixed y, GLfixed z)
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.x = x;
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.y = y;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    c->currentNormal.z = z;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClipPlanef(GLenum plane, const GLfloat* equ)
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GLfixed equx[4] = {
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(equ[0]),
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(equ[1]),
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(equ[2]),
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            gglFloatToFixed(equ[3])
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipPlanex(plane, equx, c);
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClipPlanex(GLenum plane, const GLfixed* equ)
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ogles_context_t* c = ogles_context_t::get();
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    clipPlanex(plane, equ, c);
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
248