blob: 202ca3d4d1d01042a2776734a538c6170bd0f498 [file] [log] [blame]
Jason Samsc97bb882009-07-20 14:31:06 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18#include "rsScriptC.h"
19#include "rsMatrix.h"
Romain Guyecc7ca02009-08-03 21:12:51 -070020#include "rsNoise.h"
Jason Samsc97bb882009-07-20 14:31:06 -070021
22#include "acc/acc.h"
Joe Onorato3370ec92009-08-09 11:39:02 -070023#include "utils/Timers.h"
Jason Samsc97bb882009-07-20 14:31:06 -070024
Jason Samse9ad9a72009-09-30 17:36:20 -070025#define GL_GLEXT_PROTOTYPES
26
Jason Samsc97bb882009-07-20 14:31:06 -070027#include <GLES/gl.h>
28#include <GLES/glext.h>
Jason Samsbb51c402009-11-25 13:22:07 -080029#include <GLES2/gl2.h>
30#include <GLES2/gl2ext.h>
Jason Samsc97bb882009-07-20 14:31:06 -070031
Romain Guy584a3752009-07-30 18:45:01 -070032#include <time.h>
Romain Guy584a3752009-07-30 18:45:01 -070033
Jason Samsc97bb882009-07-20 14:31:06 -070034using namespace android;
35using namespace android::renderscript;
36
37#define GET_TLS() Context::ScriptTLSStruct * tls = \
38 (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
39 Context * rsc = tls->mContext; \
40 ScriptC * sc = (ScriptC *) tls->mScript
41
Jason Samsea84a7c2009-09-04 14:42:41 -070042typedef struct {
43 float x;
44 float y;
45 float z;
46} vec3_t;
47
48typedef struct {
49 float x;
50 float y;
51 float z;
52 float w;
53} vec4_t;
54
55typedef struct {
56 float x;
57 float y;
58} vec2_t;
Jason Samsc97bb882009-07-20 14:31:06 -070059
60//////////////////////////////////////////////////////////////////////////////
61// IO routines
62//////////////////////////////////////////////////////////////////////////////
63
64static float SC_loadF(uint32_t bank, uint32_t offset)
65{
66 GET_TLS();
67 const void *vp = sc->mSlots[bank]->getPtr();
68 const float *f = static_cast<const float *>(vp);
69 //LOGE("loadF %i %i = %f %x", bank, offset, f, ((int *)&f)[0]);
70 return f[offset];
71}
72
73static int32_t SC_loadI32(uint32_t bank, uint32_t offset)
74{
75 GET_TLS();
76 const void *vp = sc->mSlots[bank]->getPtr();
77 const int32_t *i = static_cast<const int32_t *>(vp);
78 //LOGE("loadI32 %i %i = %i", bank, offset, t);
79 return i[offset];
80}
81
Romain Guyf8e136d2009-08-06 12:40:41 -070082static float* SC_loadArrayF(uint32_t bank, uint32_t offset)
Romain Guya2136d62009-08-04 17:19:48 -070083{
84 GET_TLS();
85 void *vp = sc->mSlots[bank]->getPtr();
86 float *f = static_cast<float *>(vp);
Romain Guyf8e136d2009-08-06 12:40:41 -070087 return f + offset;
Romain Guya2136d62009-08-04 17:19:48 -070088}
89
Romain Guyf8e136d2009-08-06 12:40:41 -070090static int32_t* SC_loadArrayI32(uint32_t bank, uint32_t offset)
Romain Guya2136d62009-08-04 17:19:48 -070091{
92 GET_TLS();
93 void *vp = sc->mSlots[bank]->getPtr();
94 int32_t *i = static_cast<int32_t *>(vp);
Romain Guyf8e136d2009-08-06 12:40:41 -070095 return i + offset;
Romain Guya2136d62009-08-04 17:19:48 -070096}
97
Jason Sams6b9dec02009-09-23 16:38:37 -070098static float* SC_loadSimpleMeshVerticesF(RsSimpleMesh mesh, uint32_t idx)
Romain Guyb62627e2009-08-06 22:52:13 -070099{
Jason Sams6b9dec02009-09-23 16:38:37 -0700100 SimpleMesh *tm = static_cast<SimpleMesh *>(mesh);
101 void *vp = tm->mVertexBuffers[idx]->getPtr();;
102 return static_cast<float *>(vp);
Romain Guyb62627e2009-08-06 22:52:13 -0700103}
104
Jason Sams6b9dec02009-09-23 16:38:37 -0700105static void SC_updateSimpleMesh(RsSimpleMesh mesh)
Romain Guyb62627e2009-08-06 22:52:13 -0700106{
Jason Samsbb51c402009-11-25 13:22:07 -0800107 GET_TLS();
Jason Sams6b9dec02009-09-23 16:38:37 -0700108 SimpleMesh *sm = static_cast<SimpleMesh *>(mesh);
Jason Samsbb51c402009-11-25 13:22:07 -0800109 sm->uploadAll(rsc);
Romain Guyb62627e2009-08-06 22:52:13 -0700110}
Romain Guyf8e136d2009-08-06 12:40:41 -0700111
Jason Samsc97bb882009-07-20 14:31:06 -0700112static uint32_t SC_loadU32(uint32_t bank, uint32_t offset)
113{
114 GET_TLS();
115 const void *vp = sc->mSlots[bank]->getPtr();
116 const uint32_t *i = static_cast<const uint32_t *>(vp);
117 return i[offset];
118}
119
120static void SC_loadVec4(uint32_t bank, uint32_t offset, rsc_Vector4 *v)
121{
122 GET_TLS();
123 const void *vp = sc->mSlots[bank]->getPtr();
124 const float *f = static_cast<const float *>(vp);
125 memcpy(v, &f[offset], sizeof(rsc_Vector4));
126}
127
128static void SC_loadMatrix(uint32_t bank, uint32_t offset, rsc_Matrix *m)
129{
130 GET_TLS();
131 const void *vp = sc->mSlots[bank]->getPtr();
132 const float *f = static_cast<const float *>(vp);
133 memcpy(m, &f[offset], sizeof(rsc_Matrix));
134}
135
136
137static void SC_storeF(uint32_t bank, uint32_t offset, float v)
138{
139 //LOGE("storeF %i %i %f", bank, offset, v);
140 GET_TLS();
141 void *vp = sc->mSlots[bank]->getPtr();
142 float *f = static_cast<float *>(vp);
143 f[offset] = v;
144}
145
146static void SC_storeI32(uint32_t bank, uint32_t offset, int32_t v)
147{
148 GET_TLS();
149 void *vp = sc->mSlots[bank]->getPtr();
150 int32_t *f = static_cast<int32_t *>(vp);
151 static_cast<int32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
152}
153
154static void SC_storeU32(uint32_t bank, uint32_t offset, uint32_t v)
155{
156 GET_TLS();
157 void *vp = sc->mSlots[bank]->getPtr();
158 uint32_t *f = static_cast<uint32_t *>(vp);
159 static_cast<uint32_t *>(sc->mSlots[bank]->getPtr())[offset] = v;
160}
161
162static void SC_storeVec4(uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
163{
164 GET_TLS();
165 void *vp = sc->mSlots[bank]->getPtr();
166 float *f = static_cast<float *>(vp);
167 memcpy(&f[offset], v, sizeof(rsc_Vector4));
168}
169
170static void SC_storeMatrix(uint32_t bank, uint32_t offset, const rsc_Matrix *m)
171{
172 GET_TLS();
173 void *vp = sc->mSlots[bank]->getPtr();
174 float *f = static_cast<float *>(vp);
175 memcpy(&f[offset], m, sizeof(rsc_Matrix));
176}
177
Jason Samsea84a7c2009-09-04 14:42:41 -0700178//////////////////////////////////////////////////////////////////////////////
179// Vec3 routines
180//////////////////////////////////////////////////////////////////////////////
181
182static void SC_vec3Norm(vec3_t *v)
183{
184 float len = sqrtf(v->x * v->x + v->y * v->y + v->z * v->z);
185 len = 1 / len;
186 v->x *= len;
187 v->y *= len;
188 v->z *= len;
189}
190
191static float SC_vec3Length(const vec3_t *v)
192{
193 return sqrtf(v->x * v->x + v->y * v->y + v->z * v->z);
194}
195
196static void SC_vec3Add(vec3_t *dest, const vec3_t *lhs, const vec3_t *rhs)
197{
198 dest->x = lhs->x + rhs->x;
199 dest->y = lhs->y + rhs->y;
200 dest->z = lhs->z + rhs->z;
201}
202
203static void SC_vec3Sub(vec3_t *dest, const vec3_t *lhs, const vec3_t *rhs)
204{
205 dest->x = lhs->x - rhs->x;
206 dest->y = lhs->y - rhs->y;
207 dest->z = lhs->z - rhs->z;
208}
209
210static void SC_vec3Cross(vec3_t *dest, const vec3_t *lhs, const vec3_t *rhs)
211{
212 float x = lhs->y * rhs->z - lhs->z * rhs->y;
213 float y = lhs->z * rhs->x - lhs->x * rhs->z;
214 float z = lhs->x * rhs->y - lhs->y * rhs->x;
215 dest->x = x;
216 dest->y = y;
217 dest->z = z;
218}
219
220static float SC_vec3Dot(const vec3_t *lhs, const vec3_t *rhs)
221{
222 return lhs->x * rhs->x + lhs->y * rhs->y + lhs->z * rhs->z;
223}
224
225static void SC_vec3Scale(vec3_t *lhs, float scale)
226{
227 lhs->x *= scale;
228 lhs->y *= scale;
229 lhs->z *= scale;
230}
231
Romain Guyd7fa1222009-10-09 16:05:25 -0700232//////////////////////////////////////////////////////////////////////////////
233// Vec4 routines
234//////////////////////////////////////////////////////////////////////////////
235
236static void SC_vec4Norm(vec4_t *v)
237{
238 float len = sqrtf(v->x * v->x + v->y * v->y + v->z * v->z + v->w * v->w);
239 len = 1 / len;
240 v->x *= len;
241 v->y *= len;
242 v->z *= len;
243 v->w *= len;
244}
245
246static float SC_vec4Length(const vec4_t *v)
247{
248 return sqrtf(v->x * v->x + v->y * v->y + v->z * v->z + v->w * v->w);
249}
250
251static void SC_vec4Add(vec4_t *dest, const vec4_t *lhs, const vec4_t *rhs)
252{
253 dest->x = lhs->x + rhs->x;
254 dest->y = lhs->y + rhs->y;
255 dest->z = lhs->z + rhs->z;
256 dest->w = lhs->w + rhs->w;
257}
258
259static void SC_vec4Sub(vec4_t *dest, const vec4_t *lhs, const vec4_t *rhs)
260{
261 dest->x = lhs->x - rhs->x;
262 dest->y = lhs->y - rhs->y;
263 dest->z = lhs->z - rhs->z;
264 dest->w = lhs->w - rhs->w;
265}
266
267static float SC_vec4Dot(const vec4_t *lhs, const vec4_t *rhs)
268{
269 return lhs->x * rhs->x + lhs->y * rhs->y + lhs->z * rhs->z + lhs->w * rhs->w;
270}
271
272static void SC_vec4Scale(vec4_t *lhs, float scale)
273{
274 lhs->x *= scale;
275 lhs->y *= scale;
276 lhs->z *= scale;
277 lhs->w *= scale;
278}
Jason Samsc97bb882009-07-20 14:31:06 -0700279
280//////////////////////////////////////////////////////////////////////////////
281// Math routines
282//////////////////////////////////////////////////////////////////////////////
283
Romain Guy8839ca52009-07-31 11:20:59 -0700284#define PI 3.1415926f
285#define DEG_TO_RAD PI / 180.0f
286#define RAD_TO_DEG 180.0f / PI
287
Romain Guycac80a62009-08-18 11:39:17 -0700288static float SC_sinf_fast(float x)
289{
290 const float A = 1.0f / (2.0f * M_PI);
291 const float B = -16.0f;
292 const float C = 8.0f;
Jason Samsea84a7c2009-09-04 14:42:41 -0700293
Romain Guycac80a62009-08-18 11:39:17 -0700294 // scale angle for easy argument reduction
295 x *= A;
Jason Samsea84a7c2009-09-04 14:42:41 -0700296
Romain Guycac80a62009-08-18 11:39:17 -0700297 if (fabsf(x) >= 0.5f) {
298 // argument reduction
299 x = x - ceilf(x + 0.5f) + 1.0f;
300 }
Jason Samsea84a7c2009-09-04 14:42:41 -0700301
Romain Guycac80a62009-08-18 11:39:17 -0700302 const float y = B * x * fabsf(x) + C * x;
303 return 0.2215f * (y * fabsf(y) - y) + y;
304}
305
306static float SC_cosf_fast(float x)
307{
308 x += float(M_PI / 2);
309
310 const float A = 1.0f / (2.0f * M_PI);
311 const float B = -16.0f;
312 const float C = 8.0f;
Jason Samsea84a7c2009-09-04 14:42:41 -0700313
Romain Guycac80a62009-08-18 11:39:17 -0700314 // scale angle for easy argument reduction
315 x *= A;
Jason Samsea84a7c2009-09-04 14:42:41 -0700316
Romain Guycac80a62009-08-18 11:39:17 -0700317 if (fabsf(x) >= 0.5f) {
318 // argument reduction
319 x = x - ceilf(x + 0.5f) + 1.0f;
320 }
Jason Samsea84a7c2009-09-04 14:42:41 -0700321
Romain Guycac80a62009-08-18 11:39:17 -0700322 const float y = B * x * fabsf(x) + C * x;
323 return 0.2215f * (y * fabsf(y) - y) + y;
324}
325
Jason Samsc97bb882009-07-20 14:31:06 -0700326static float SC_randf(float max)
327{
328 float r = (float)rand();
329 return r / RAND_MAX * max;
330}
331
Romain Guy8839ca52009-07-31 11:20:59 -0700332static float SC_randf2(float min, float max)
333{
334 float r = (float)rand();
335 return r / RAND_MAX * (max - min) + min;
336}
337
Romain Guyd7fa1222009-10-09 16:05:25 -0700338static int SC_sign(int value)
339{
340 return (value > 0) - (value < 0);
341}
342
343static float SC_signf(float value)
344{
345 return (value > 0) - (value < 0);
346}
347
Romain Guy8839ca52009-07-31 11:20:59 -0700348static float SC_clampf(float amount, float low, float high)
349{
350 return amount < low ? low : (amount > high ? high : amount);
351}
352
Romain Guya9d2d5e2009-08-09 17:04:54 -0700353static int SC_clamp(int amount, int low, int high)
354{
355 return amount < low ? low : (amount > high ? high : amount);
356}
357
Romain Guy8839ca52009-07-31 11:20:59 -0700358static float SC_maxf(float a, float b)
359{
Jason Sams1bada8c2009-08-09 17:01:55 -0700360 return a > b ? a : b;
Romain Guy8839ca52009-07-31 11:20:59 -0700361}
362
363static float SC_minf(float a, float b)
364{
Jason Sams1bada8c2009-08-09 17:01:55 -0700365 return a < b ? a : b;
Romain Guy8839ca52009-07-31 11:20:59 -0700366}
367
368static float SC_sqrf(float v)
369{
Jason Sams1bada8c2009-08-09 17:01:55 -0700370 return v * v;
Romain Guy8839ca52009-07-31 11:20:59 -0700371}
372
Romain Guy8f5c94b2009-08-08 18:30:19 -0700373static int SC_sqr(int v)
374{
375 return v * v;
376}
377
Jason Samsd342fd72009-09-18 14:24:24 -0700378static float SC_fracf(float v)
379{
380 return v - floorf(v);
381}
382
383static float SC_roundf(float v)
384{
385 return floorf(v + 0.4999999999);
386}
387
Romain Guy8839ca52009-07-31 11:20:59 -0700388static float SC_distf2(float x1, float y1, float x2, float y2)
389{
390 float x = x2 - x1;
391 float y = y2 - y1;
Jason Sams1bada8c2009-08-09 17:01:55 -0700392 return sqrtf(x * x + y * y);
Romain Guy8839ca52009-07-31 11:20:59 -0700393}
394
395static float SC_distf3(float x1, float y1, float z1, float x2, float y2, float z2)
396{
397 float x = x2 - x1;
398 float y = y2 - y1;
399 float z = z2 - z1;
Jason Sams1bada8c2009-08-09 17:01:55 -0700400 return sqrtf(x * x + y * y + z * z);
Romain Guy8839ca52009-07-31 11:20:59 -0700401}
402
403static float SC_magf2(float a, float b)
404{
405 return sqrtf(a * a + b * b);
406}
407
408static float SC_magf3(float a, float b, float c)
409{
410 return sqrtf(a * a + b * b + c * c);
411}
412
413static float SC_radf(float degrees)
414{
Jason Sams1bada8c2009-08-09 17:01:55 -0700415 return degrees * DEG_TO_RAD;
Romain Guy8839ca52009-07-31 11:20:59 -0700416}
417
418static float SC_degf(float radians)
419{
Jason Sams1bada8c2009-08-09 17:01:55 -0700420 return radians * RAD_TO_DEG;
Romain Guy8839ca52009-07-31 11:20:59 -0700421}
422
423static float SC_lerpf(float start, float stop, float amount)
424{
425 return start + (stop - start) * amount;
426}
427
428static float SC_normf(float start, float stop, float value)
429{
430 return (value - start) / (stop - start);
431}
432
433static float SC_mapf(float minStart, float minStop, float maxStart, float maxStop, float value)
434{
435 return maxStart + (maxStart - maxStop) * ((value - minStart) / (minStop - minStart));
436}
Jason Samsc97bb882009-07-20 14:31:06 -0700437
Romain Guy584a3752009-07-30 18:45:01 -0700438//////////////////////////////////////////////////////////////////////////////
439// Time routines
440//////////////////////////////////////////////////////////////////////////////
Jason Samsc97bb882009-07-20 14:31:06 -0700441
Joe Onorato3370ec92009-08-09 11:39:02 -0700442static int32_t SC_second()
Romain Guy584a3752009-07-30 18:45:01 -0700443{
444 GET_TLS();
445
446 time_t rawtime;
447 time(&rawtime);
448
Romain Guybaed7272009-11-11 15:36:06 -0800449 struct tm *timeinfo;
450 timeinfo = localtime(&rawtime);
451 return timeinfo->tm_sec;
Romain Guy584a3752009-07-30 18:45:01 -0700452}
453
Joe Onorato3370ec92009-08-09 11:39:02 -0700454static int32_t SC_minute()
Romain Guy584a3752009-07-30 18:45:01 -0700455{
456 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700457
Romain Guy584a3752009-07-30 18:45:01 -0700458 time_t rawtime;
459 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700460
Romain Guybaed7272009-11-11 15:36:06 -0800461 struct tm *timeinfo;
462 timeinfo = localtime(&rawtime);
463 return timeinfo->tm_min;
Jason Sams1bada8c2009-08-09 17:01:55 -0700464}
Romain Guy584a3752009-07-30 18:45:01 -0700465
Joe Onorato3370ec92009-08-09 11:39:02 -0700466static int32_t SC_hour()
Romain Guy584a3752009-07-30 18:45:01 -0700467{
468 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700469
Romain Guy584a3752009-07-30 18:45:01 -0700470 time_t rawtime;
471 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700472
Romain Guybaed7272009-11-11 15:36:06 -0800473 struct tm *timeinfo;
474 timeinfo = localtime(&rawtime);
475 return timeinfo->tm_hour;
Romain Guy8839ca52009-07-31 11:20:59 -0700476}
477
Joe Onorato3370ec92009-08-09 11:39:02 -0700478static int32_t SC_day()
Romain Guy8839ca52009-07-31 11:20:59 -0700479{
480 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700481
Romain Guy8839ca52009-07-31 11:20:59 -0700482 time_t rawtime;
483 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700484
Romain Guybaed7272009-11-11 15:36:06 -0800485 struct tm *timeinfo;
486 timeinfo = localtime(&rawtime);
487 return timeinfo->tm_mday;
Jason Sams1bada8c2009-08-09 17:01:55 -0700488}
Jason Samsc97bb882009-07-20 14:31:06 -0700489
Joe Onorato3370ec92009-08-09 11:39:02 -0700490static int32_t SC_month()
Romain Guy8839ca52009-07-31 11:20:59 -0700491{
492 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700493
Romain Guy8839ca52009-07-31 11:20:59 -0700494 time_t rawtime;
495 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700496
Romain Guybaed7272009-11-11 15:36:06 -0800497 struct tm *timeinfo;
498 timeinfo = localtime(&rawtime);
499 return timeinfo->tm_mon;
Jason Sams1bada8c2009-08-09 17:01:55 -0700500}
Romain Guy8839ca52009-07-31 11:20:59 -0700501
Joe Onorato3370ec92009-08-09 11:39:02 -0700502static int32_t SC_year()
Romain Guy8839ca52009-07-31 11:20:59 -0700503{
504 GET_TLS();
Jason Sams1bada8c2009-08-09 17:01:55 -0700505
Romain Guy8839ca52009-07-31 11:20:59 -0700506 time_t rawtime;
507 time(&rawtime);
Jason Sams1bada8c2009-08-09 17:01:55 -0700508
Romain Guybaed7272009-11-11 15:36:06 -0800509 struct tm *timeinfo;
510 timeinfo = localtime(&rawtime);
511 return timeinfo->tm_year;
Romain Guy8839ca52009-07-31 11:20:59 -0700512}
513
Joe Onorato3370ec92009-08-09 11:39:02 -0700514static int32_t SC_uptimeMillis()
515{
516 return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
517}
518
519static int32_t SC_startTimeMillis()
520{
521 GET_TLS();
522 return sc->mEnviroment.mStartTimeMillis;
523}
524
525static int32_t SC_elapsedTimeMillis()
526{
527 GET_TLS();
528 return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC))
529 - sc->mEnviroment.mStartTimeMillis;
530}
531
Jason Samsc97bb882009-07-20 14:31:06 -0700532//////////////////////////////////////////////////////////////////////////////
533// Matrix routines
534//////////////////////////////////////////////////////////////////////////////
535
536
537static void SC_matrixLoadIdentity(rsc_Matrix *mat)
538{
539 Matrix *m = reinterpret_cast<Matrix *>(mat);
540 m->loadIdentity();
541}
542
543static void SC_matrixLoadFloat(rsc_Matrix *mat, const float *f)
544{
545 Matrix *m = reinterpret_cast<Matrix *>(mat);
546 m->load(f);
547}
548
549static void SC_matrixLoadMat(rsc_Matrix *mat, const rsc_Matrix *newmat)
550{
551 Matrix *m = reinterpret_cast<Matrix *>(mat);
552 m->load(reinterpret_cast<const Matrix *>(newmat));
553}
554
555static void SC_matrixLoadRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
556{
557 Matrix *m = reinterpret_cast<Matrix *>(mat);
558 m->loadRotate(rot, x, y, z);
559}
560
561static void SC_matrixLoadScale(rsc_Matrix *mat, float x, float y, float z)
562{
563 Matrix *m = reinterpret_cast<Matrix *>(mat);
564 m->loadScale(x, y, z);
565}
566
567static void SC_matrixLoadTranslate(rsc_Matrix *mat, float x, float y, float z)
568{
569 Matrix *m = reinterpret_cast<Matrix *>(mat);
570 m->loadTranslate(x, y, z);
571}
572
573static void SC_matrixLoadMultiply(rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
574{
575 Matrix *m = reinterpret_cast<Matrix *>(mat);
576 m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
577 reinterpret_cast<const Matrix *>(rhs));
578}
579
580static void SC_matrixMultiply(rsc_Matrix *mat, const rsc_Matrix *rhs)
581{
582 Matrix *m = reinterpret_cast<Matrix *>(mat);
583 m->multiply(reinterpret_cast<const Matrix *>(rhs));
584}
585
586static void SC_matrixRotate(rsc_Matrix *mat, float rot, float x, float y, float z)
587{
588 Matrix *m = reinterpret_cast<Matrix *>(mat);
589 m->rotate(rot, x, y, z);
590}
591
592static void SC_matrixScale(rsc_Matrix *mat, float x, float y, float z)
593{
594 Matrix *m = reinterpret_cast<Matrix *>(mat);
595 m->scale(x, y, z);
596}
597
598static void SC_matrixTranslate(rsc_Matrix *mat, float x, float y, float z)
599{
600 Matrix *m = reinterpret_cast<Matrix *>(mat);
601 m->translate(x, y, z);
602}
603
604
Jason Sams334ea0c2009-08-17 13:56:09 -0700605static void SC_vec2Rand(float *vec, float maxLen)
606{
607 float angle = SC_randf(PI * 2);
608 float len = SC_randf(maxLen);
609 vec[0] = len * sinf(angle);
610 vec[1] = len * cosf(angle);
611}
612
Jason Samsc97bb882009-07-20 14:31:06 -0700613
614
615//////////////////////////////////////////////////////////////////////////////
616// Context
617//////////////////////////////////////////////////////////////////////////////
618
619static void SC_bindTexture(RsProgramFragment vpf, uint32_t slot, RsAllocation va)
620{
621 GET_TLS();
Jason Sams68afd012009-12-17 16:55:08 -0800622 rsi_ProgramBindTexture(rsc,
623 static_cast<ProgramFragment *>(vpf),
624 slot,
625 static_cast<Allocation *>(va));
Jason Samsc97bb882009-07-20 14:31:06 -0700626
627}
628
629static void SC_bindSampler(RsProgramFragment vpf, uint32_t slot, RsSampler vs)
630{
631 GET_TLS();
Jason Sams68afd012009-12-17 16:55:08 -0800632 rsi_ProgramBindSampler(rsc,
633 static_cast<ProgramFragment *>(vpf),
634 slot,
635 static_cast<Sampler *>(vs));
Jason Samsc97bb882009-07-20 14:31:06 -0700636
637}
638
639static void SC_bindProgramFragmentStore(RsProgramFragmentStore pfs)
640{
641 GET_TLS();
642 rsi_ContextBindProgramFragmentStore(rsc, pfs);
643
644}
645
646static void SC_bindProgramFragment(RsProgramFragment pf)
647{
648 GET_TLS();
649 rsi_ContextBindProgramFragment(rsc, pf);
650
651}
652
Jason Samsee411122009-07-21 12:20:54 -0700653static void SC_bindProgramVertex(RsProgramVertex pv)
654{
655 GET_TLS();
656 rsi_ContextBindProgramVertex(rsc, pv);
657
658}
Jason Samsc97bb882009-07-20 14:31:06 -0700659
660//////////////////////////////////////////////////////////////////////////////
Jason Samsb0ec1b42009-07-28 12:02:16 -0700661// VP
662//////////////////////////////////////////////////////////////////////////////
663
664static void SC_vpLoadModelMatrix(const rsc_Matrix *m)
665{
666 GET_TLS();
667 rsc->getVertex()->setModelviewMatrix(m);
668}
669
670static void SC_vpLoadTextureMatrix(const rsc_Matrix *m)
671{
672 GET_TLS();
673 rsc->getVertex()->setTextureMatrix(m);
674}
675
676
677
678//////////////////////////////////////////////////////////////////////////////
Jason Samsc97bb882009-07-20 14:31:06 -0700679// Drawing
680//////////////////////////////////////////////////////////////////////////////
681
Romain Guy6c0cc6d2009-08-07 15:40:32 -0700682static void SC_drawLine(float x1, float y1, float z1,
683 float x2, float y2, float z2)
684{
685 GET_TLS();
Jason Sams156cce62010-03-03 13:03:18 -0800686 if (!rsc->setupCheck()) {
687 return;
688 }
Romain Guy6c0cc6d2009-08-07 15:40:32 -0700689
690 float vtx[] = { x1, y1, z1, x2, y2, z2 };
Jason Samsbb51c402009-11-25 13:22:07 -0800691 VertexArray va;
Jason Samsdf48b572010-01-25 12:31:24 -0800692 va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
Jason Samsbb51c402009-11-25 13:22:07 -0800693 if (rsc->checkVersion2_0()) {
Jason Sams718cd1f2009-12-23 14:35:29 -0800694 va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
Jason Samsbb51c402009-11-25 13:22:07 -0800695 } else {
Jason Sams718cd1f2009-12-23 14:35:29 -0800696 va.setupGL(rsc, &rsc->mStateVertexArray);
Jason Samsbb51c402009-11-25 13:22:07 -0800697 }
Romain Guy6c0cc6d2009-08-07 15:40:32 -0700698
699 glDrawArrays(GL_LINES, 0, 2);
700}
701
Jason Sams5235cf32009-09-28 18:12:56 -0700702static void SC_drawPoint(float x, float y, float z)
703{
704 GET_TLS();
Jason Sams156cce62010-03-03 13:03:18 -0800705 if (!rsc->setupCheck()) {
706 return;
707 }
Jason Sams5235cf32009-09-28 18:12:56 -0700708
709 float vtx[] = { x, y, z };
710
Jason Samsbb51c402009-11-25 13:22:07 -0800711 VertexArray va;
Jason Samsdf48b572010-01-25 12:31:24 -0800712 va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
Jason Samsbb51c402009-11-25 13:22:07 -0800713 if (rsc->checkVersion2_0()) {
Jason Sams718cd1f2009-12-23 14:35:29 -0800714 va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
Jason Samsbb51c402009-11-25 13:22:07 -0800715 } else {
Jason Sams718cd1f2009-12-23 14:35:29 -0800716 va.setupGL(rsc, &rsc->mStateVertexArray);
Jason Samsbb51c402009-11-25 13:22:07 -0800717 }
Jason Sams5235cf32009-09-28 18:12:56 -0700718
719 glDrawArrays(GL_POINTS, 0, 1);
720}
721
Romain Guy8f5c94b2009-08-08 18:30:19 -0700722static void SC_drawQuadTexCoords(float x1, float y1, float z1,
723 float u1, float v1,
724 float x2, float y2, float z2,
725 float u2, float v2,
726 float x3, float y3, float z3,
727 float u3, float v3,
728 float x4, float y4, float z4,
729 float u4, float v4)
Jason Samsc97bb882009-07-20 14:31:06 -0700730{
731 GET_TLS();
Jason Sams156cce62010-03-03 13:03:18 -0800732 if (!rsc->setupCheck()) {
733 return;
734 }
Jason Sams40a29e82009-08-10 14:55:26 -0700735
Jason Samsc97bb882009-07-20 14:31:06 -0700736 //LOGE("Quad");
737 //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
738 //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
739 //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
740 //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
Jason Sams40a29e82009-08-10 14:55:26 -0700741
Jason Samsc97bb882009-07-20 14:31:06 -0700742 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
Romain Guy8f5c94b2009-08-08 18:30:19 -0700743 const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
Jason Samsc97bb882009-07-20 14:31:06 -0700744
Jason Samsbb51c402009-11-25 13:22:07 -0800745 VertexArray va;
Jason Samsdf48b572010-01-25 12:31:24 -0800746 va.addLegacy(GL_FLOAT, 3, 12, RS_KIND_POSITION, false, (uint32_t)vtx);
747 va.addLegacy(GL_FLOAT, 2, 8, RS_KIND_TEXTURE, false, (uint32_t)tex);
Jason Samsbb51c402009-11-25 13:22:07 -0800748 if (rsc->checkVersion2_0()) {
Jason Sams718cd1f2009-12-23 14:35:29 -0800749 va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
Jason Samsbb51c402009-11-25 13:22:07 -0800750 } else {
Jason Sams718cd1f2009-12-23 14:35:29 -0800751 va.setupGL(rsc, &rsc->mStateVertexArray);
Jason Samsbb51c402009-11-25 13:22:07 -0800752 }
Jason Samsc97bb882009-07-20 14:31:06 -0700753
Jason Samsc97bb882009-07-20 14:31:06 -0700754
755 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
756}
757
Romain Guy8f5c94b2009-08-08 18:30:19 -0700758static void SC_drawQuad(float x1, float y1, float z1,
759 float x2, float y2, float z2,
760 float x3, float y3, float z3,
761 float x4, float y4, float z4)
762{
763 SC_drawQuadTexCoords(x1, y1, z1, 0, 1,
764 x2, y2, z2, 1, 1,
765 x3, y3, z3, 1, 0,
766 x4, y4, z4, 0, 0);
767}
768
Jason Samse9ad9a72009-09-30 17:36:20 -0700769static void SC_drawSpriteScreenspace(float x, float y, float z, float w, float h)
770{
771 GET_TLS();
Jason Samsbb51c402009-11-25 13:22:07 -0800772 ObjectBaseRef<const ProgramVertex> tmp(rsc->getVertex());
773 rsc->setVertex(rsc->getDefaultProgramVertex());
774 //rsc->setupCheck();
Jason Samse9ad9a72009-09-30 17:36:20 -0700775
Jason Samsbb51c402009-11-25 13:22:07 -0800776 //GLint crop[4] = {0, h, w, -h};
777
778 float sh = rsc->getHeight();
779
780 SC_drawQuad(x, sh - y, z,
781 x+w, sh - y, z,
782 x+w, sh - (y+h), z,
783 x, sh - (y+h), z);
784 rsc->setVertex((ProgramVertex *)tmp.get());
Jason Samse9ad9a72009-09-30 17:36:20 -0700785}
786
Joe Onorato6656c1b2010-01-14 15:59:35 -0500787static void SC_drawSpriteScreenspaceCropped(float x, float y, float z, float w, float h,
788 float cx0, float cy0, float cx1, float cy1)
789{
790 GET_TLS();
Jason Sams156cce62010-03-03 13:03:18 -0800791 if (!rsc->setupCheck()) {
792 return;
793 }
Joe Onorato6656c1b2010-01-14 15:59:35 -0500794
795 GLint crop[4] = {cx0, cy0, cx1, cy1};
796 glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
797 glDrawTexfOES(x, y, z, w, h);
798}
799
Jason Samse9ad9a72009-09-30 17:36:20 -0700800static void SC_drawSprite(float x, float y, float z, float w, float h)
801{
802 GET_TLS();
Jason Samse9ad9a72009-09-30 17:36:20 -0700803 float vin[3] = {x, y, z};
804 float vout[4];
805
806 //LOGE("ds in %f %f %f", x, y, z);
807 rsc->getVertex()->transformToScreen(rsc, vout, vin);
808 //LOGE("ds out %f %f %f %f", vout[0], vout[1], vout[2], vout[3]);
809 vout[0] /= vout[3];
810 vout[1] /= vout[3];
811 vout[2] /= vout[3];
812
813 vout[0] *= rsc->getWidth() / 2;
814 vout[1] *= rsc->getHeight() / 2;
815 vout[0] += rsc->getWidth() / 2;
816 vout[1] += rsc->getHeight() / 2;
817
818 vout[0] -= w/2;
819 vout[1] -= h/2;
820
821 //LOGE("ds out2 %f %f %f", vout[0], vout[1], vout[2]);
822
823 // U, V, W, H
Jason Samsbb51c402009-11-25 13:22:07 -0800824 SC_drawSpriteScreenspace(vout[0], vout[1], z, h, w);
825 //rsc->setupCheck();
Jason Samse9ad9a72009-09-30 17:36:20 -0700826}
827
828
Jason Sams6f5c61c2009-07-28 17:20:11 -0700829static void SC_drawRect(float x1, float y1,
830 float x2, float y2, float z)
831{
832 SC_drawQuad(x1, y2, z,
833 x2, y2, z,
834 x2, y1, z,
835 x1, y1, z);
836}
837
Jason Sams1bada8c2009-08-09 17:01:55 -0700838static void SC_drawSimpleMesh(RsSimpleMesh vsm)
839{
840 GET_TLS();
841 SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
Jason Sams156cce62010-03-03 13:03:18 -0800842 if (!rsc->setupCheck()) {
843 return;
844 }
Jason Samsbb51c402009-11-25 13:22:07 -0800845 sm->render(rsc);
Jason Sams1bada8c2009-08-09 17:01:55 -0700846}
847
848static void SC_drawSimpleMeshRange(RsSimpleMesh vsm, uint32_t start, uint32_t len)
849{
850 GET_TLS();
851 SimpleMesh *sm = static_cast<SimpleMesh *>(vsm);
Jason Sams156cce62010-03-03 13:03:18 -0800852 if (!rsc->setupCheck()) {
853 return;
854 }
Jason Samsbb51c402009-11-25 13:22:07 -0800855 sm->renderRange(rsc, start, len);
Jason Sams1bada8c2009-08-09 17:01:55 -0700856}
857
858
Jason Samsc97bb882009-07-20 14:31:06 -0700859//////////////////////////////////////////////////////////////////////////////
860//
861//////////////////////////////////////////////////////////////////////////////
862
Jason Samsc97bb882009-07-20 14:31:06 -0700863static void SC_color(float r, float g, float b, float a)
864{
Jason Samsbb51c402009-11-25 13:22:07 -0800865 GET_TLS();
Jason Samsce9adcc2009-12-16 14:13:06 -0800866 rsc->mStateVertex.color[0] = r;
867 rsc->mStateVertex.color[1] = g;
868 rsc->mStateVertex.color[2] = b;
869 rsc->mStateVertex.color[3] = a;
Jason Sams68afd012009-12-17 16:55:08 -0800870 if (!rsc->checkVersion2_0()) {
Jason Samsbb51c402009-11-25 13:22:07 -0800871 glColor4f(r, g, b, a);
872 }
Jason Samsc97bb882009-07-20 14:31:06 -0700873}
874
Romain Guyb62627e2009-08-06 22:52:13 -0700875static void SC_ambient(float r, float g, float b, float a)
876{
877 GLfloat params[] = { r, g, b, a };
878 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, params);
879}
880
881static void SC_diffuse(float r, float g, float b, float a)
882{
883 GLfloat params[] = { r, g, b, a };
884 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, params);
885}
886
887static void SC_specular(float r, float g, float b, float a)
888{
889 GLfloat params[] = { r, g, b, a };
890 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, params);
891}
892
893static void SC_emission(float r, float g, float b, float a)
894{
895 GLfloat params[] = { r, g, b, a };
896 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, params);
897}
898
Romain Guy6c0cc6d2009-08-07 15:40:32 -0700899static void SC_shininess(float s)
Romain Guyb62627e2009-08-06 22:52:13 -0700900{
Romain Guy6c0cc6d2009-08-07 15:40:32 -0700901 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, s);
Romain Guyb62627e2009-08-06 22:52:13 -0700902}
903
Romain Guy2d496bf2009-09-04 17:55:41 -0700904static void SC_pointAttenuation(float a, float b, float c)
905{
906 GLfloat params[] = { a, b, c };
907 glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, params);
908}
909
Romain Guyd22fff72009-08-20 17:08:33 -0700910static void SC_hsbToRgb(float h, float s, float b, float* rgb)
Romain Guya32d1002009-07-31 15:33:59 -0700911{
912 float red = 0.0f;
913 float green = 0.0f;
914 float blue = 0.0f;
Jason Sams1bada8c2009-08-09 17:01:55 -0700915
Romain Guya32d1002009-07-31 15:33:59 -0700916 float x = h;
917 float y = s;
918 float z = b;
Jason Sams1bada8c2009-08-09 17:01:55 -0700919
Romain Guya32d1002009-07-31 15:33:59 -0700920 float hf = (x - (int) x) * 6.0f;
921 int ihf = (int) hf;
922 float f = hf - ihf;
923 float pv = z * (1.0f - y);
924 float qv = z * (1.0f - y * f);
925 float tv = z * (1.0f - y * (1.0f - f));
Jason Sams1bada8c2009-08-09 17:01:55 -0700926
Romain Guya32d1002009-07-31 15:33:59 -0700927 switch (ihf) {
928 case 0: // Red is the dominant color
929 red = z;
930 green = tv;
931 blue = pv;
932 break;
933 case 1: // Green is the dominant color
934 red = qv;
935 green = z;
936 blue = pv;
937 break;
938 case 2:
939 red = pv;
940 green = z;
941 blue = tv;
942 break;
943 case 3: // Blue is the dominant color
944 red = pv;
945 green = qv;
946 blue = z;
947 break;
948 case 4:
949 red = tv;
950 green = pv;
951 blue = z;
952 break;
953 case 5: // Red is the dominant color
954 red = z;
955 green = pv;
956 blue = qv;
957 break;
958 }
Jason Sams1bada8c2009-08-09 17:01:55 -0700959
Romain Guyd22fff72009-08-20 17:08:33 -0700960 rgb[0] = red;
961 rgb[1] = green;
962 rgb[2] = blue;
963}
964
965static int SC_hsbToAbgr(float h, float s, float b, float a)
966{
967 float rgb[3];
968 SC_hsbToRgb(h, s, b, rgb);
969 return int(a * 255.0f) << 24 |
970 int(rgb[2] * 255.0f) << 16 |
971 int(rgb[1] * 255.0f) << 8 |
972 int(rgb[0] * 255.0f);
973}
974
975static void SC_hsb(float h, float s, float b, float a)
976{
Jason Samsbb51c402009-11-25 13:22:07 -0800977 GET_TLS();
Romain Guyd22fff72009-08-20 17:08:33 -0700978 float rgb[3];
979 SC_hsbToRgb(h, s, b, rgb);
Jason Samsbb51c402009-11-25 13:22:07 -0800980 if (rsc->checkVersion2_0()) {
981 glVertexAttrib4f(1, rgb[0], rgb[1], rgb[2], a);
982 } else {
983 glColor4f(rgb[0], rgb[1], rgb[2], a);
984 }
Romain Guya32d1002009-07-31 15:33:59 -0700985}
986
Jason Samsb0ec1b42009-07-28 12:02:16 -0700987static void SC_uploadToTexture(RsAllocation va, uint32_t baseMipLevel)
Jason Samsc97bb882009-07-20 14:31:06 -0700988{
989 GET_TLS();
Jason Samsc2908e62010-02-23 17:44:28 -0800990 rsi_AllocationUploadToTexture(rsc, va, false, baseMipLevel);
Jason Samsc97bb882009-07-20 14:31:06 -0700991}
992
Jason Sams1bada8c2009-08-09 17:01:55 -0700993static void SC_uploadToBufferObject(RsAllocation va)
994{
995 GET_TLS();
996 rsi_AllocationUploadToBufferObject(rsc, va);
997}
998
Jason Samsea87e962010-01-12 12:12:28 -0800999static void SC_syncToGL(RsAllocation va)
1000{
1001 GET_TLS();
1002 Allocation *a = static_cast<Allocation *>(va);
1003
1004}
1005
Jason Samsc97bb882009-07-20 14:31:06 -07001006static void SC_ClearColor(float r, float g, float b, float a)
1007{
1008 //LOGE("c %f %f %f %f", r, g, b, a);
1009 GET_TLS();
1010 sc->mEnviroment.mClearColor[0] = r;
1011 sc->mEnviroment.mClearColor[1] = g;
1012 sc->mEnviroment.mClearColor[2] = b;
1013 sc->mEnviroment.mClearColor[3] = a;
1014}
1015
Jason Samsb0ec1b42009-07-28 12:02:16 -07001016static void SC_debugF(const char *s, float f)
1017{
1018 LOGE("%s %f", s, f);
1019}
1020
Romain Guyd22fff72009-08-20 17:08:33 -07001021static void SC_debugHexF(const char *s, float f)
1022{
1023 LOGE("%s 0x%x", s, *((int *) (&f)));
1024}
1025
Jason Samsb0ec1b42009-07-28 12:02:16 -07001026static void SC_debugI32(const char *s, int32_t i)
1027{
1028 LOGE("%s %i", s, i);
1029}
1030
Romain Guyd22fff72009-08-20 17:08:33 -07001031static void SC_debugHexI32(const char *s, int32_t i)
1032{
1033 LOGE("%s 0x%x", s, i);
1034}
1035
Jason Sams40a29e82009-08-10 14:55:26 -07001036static uint32_t SC_getWidth()
1037{
1038 GET_TLS();
1039 return rsc->getWidth();
1040}
Jason Samsc97bb882009-07-20 14:31:06 -07001041
Jason Sams40a29e82009-08-10 14:55:26 -07001042static uint32_t SC_getHeight()
1043{
1044 GET_TLS();
1045 return rsc->getHeight();
1046}
Jason Samsc97bb882009-07-20 14:31:06 -07001047
Jason Sams334ea0c2009-08-17 13:56:09 -07001048static uint32_t SC_colorFloatRGBAtoUNorm8(float r, float g, float b, float a)
1049{
1050 uint32_t c = 0;
1051 c |= (uint32_t)(r * 255.f + 0.5f);
1052 c |= ((uint32_t)(g * 255.f + 0.5f)) << 8;
1053 c |= ((uint32_t)(b * 255.f + 0.5f)) << 16;
1054 c |= ((uint32_t)(a * 255.f + 0.5f)) << 24;
1055 return c;
1056}
1057
1058static uint32_t SC_colorFloatRGBAto565(float r, float g, float b)
1059{
1060 uint32_t ir = (uint32_t)(r * 255.f + 0.5f);
1061 uint32_t ig = (uint32_t)(g * 255.f + 0.5f);
1062 uint32_t ib = (uint32_t)(b * 255.f + 0.5f);
1063 return rs888to565(ir, ig, ib);
1064}
1065
Jason Sams516c3192009-10-06 13:58:47 -07001066static uint32_t SC_toClient(void *data, int cmdID, int len, int waitForSpace)
1067{
1068 GET_TLS();
1069 return rsc->sendMessageToClient(data, cmdID, len, waitForSpace != 0);
1070}
1071
Jason Samsbd2197f2009-10-07 18:14:01 -07001072static void SC_scriptCall(int scriptID)
1073{
1074 GET_TLS();
1075 rsc->runScript((Script *)scriptID, 0);
1076}
1077
1078
Jason Samsc97bb882009-07-20 14:31:06 -07001079//////////////////////////////////////////////////////////////////////////////
1080// Class implementation
1081//////////////////////////////////////////////////////////////////////////////
1082
1083ScriptCState::SymbolTable_t ScriptCState::gSyms[] = {
1084 // IO
1085 { "loadI32", (void *)&SC_loadI32,
1086 "int", "(int, int)" },
1087 //{ "loadU32", (void *)&SC_loadU32, "unsigned int", "(int, int)" },
1088 { "loadF", (void *)&SC_loadF,
1089 "float", "(int, int)" },
Romain Guya2136d62009-08-04 17:19:48 -07001090 { "loadArrayF", (void *)&SC_loadArrayF,
Romain Guyf8e136d2009-08-06 12:40:41 -07001091 "float*", "(int, int)" },
Romain Guya2136d62009-08-04 17:19:48 -07001092 { "loadArrayI32", (void *)&SC_loadArrayI32,
Romain Guyf8e136d2009-08-06 12:40:41 -07001093 "int*", "(int, int)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001094 { "loadVec4", (void *)&SC_loadVec4,
1095 "void", "(int, int, float *)" },
1096 { "loadMatrix", (void *)&SC_loadMatrix,
1097 "void", "(int, int, float *)" },
1098 { "storeI32", (void *)&SC_storeI32,
1099 "void", "(int, int, int)" },
1100 //{ "storeU32", (void *)&SC_storeU32, "void", "(int, int, unsigned int)" },
1101 { "storeF", (void *)&SC_storeF,
1102 "void", "(int, int, float)" },
1103 { "storeVec4", (void *)&SC_storeVec4,
1104 "void", "(int, int, float *)" },
1105 { "storeMatrix", (void *)&SC_storeMatrix,
1106 "void", "(int, int, float *)" },
Jason Sams6b9dec02009-09-23 16:38:37 -07001107 { "loadSimpleMeshVerticesF", (void *)&SC_loadSimpleMeshVerticesF,
1108 "float*", "(int, int)" },
1109 { "updateSimpleMesh", (void *)&SC_updateSimpleMesh,
Romain Guyb62627e2009-08-06 22:52:13 -07001110 "void", "(int)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001111
1112 // math
Romain Guya9d2d5e2009-08-09 17:04:54 -07001113 { "modf", (void *)&fmod,
1114 "float", "(float, float)" },
Romain Guy8f5c94b2009-08-08 18:30:19 -07001115 { "abs", (void *)&abs,
1116 "int", "(int)" },
Romain Guybd5b5722009-09-29 13:17:27 -07001117 { "absf", (void *)&fabsf,
Romain Guy8f5c94b2009-08-08 18:30:19 -07001118 "float", "(float)" },
Romain Guycac80a62009-08-18 11:39:17 -07001119 { "sinf_fast", (void *)&SC_sinf_fast,
1120 "float", "(float)" },
1121 { "cosf_fast", (void *)&SC_cosf_fast,
1122 "float", "(float)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001123 { "sinf", (void *)&sinf,
1124 "float", "(float)" },
1125 { "cosf", (void *)&cosf,
1126 "float", "(float)" },
Romain Guy8839ca52009-07-31 11:20:59 -07001127 { "asinf", (void *)&asinf,
1128 "float", "(float)" },
1129 { "acosf", (void *)&acosf,
1130 "float", "(float)" },
1131 { "atanf", (void *)&atanf,
1132 "float", "(float)" },
1133 { "atan2f", (void *)&atan2f,
Romain Guya32d1002009-07-31 15:33:59 -07001134 "float", "(float, float)" },
Jason Sams6f5c61c2009-07-28 17:20:11 -07001135 { "fabsf", (void *)&fabsf,
Jason Samsc97bb882009-07-20 14:31:06 -07001136 "float", "(float)" },
1137 { "randf", (void *)&SC_randf,
1138 "float", "(float)" },
Romain Guy8839ca52009-07-31 11:20:59 -07001139 { "randf2", (void *)&SC_randf2,
1140 "float", "(float, float)" },
Jason Samsb0ec1b42009-07-28 12:02:16 -07001141 { "floorf", (void *)&floorf,
1142 "float", "(float)" },
Jason Samsd342fd72009-09-18 14:24:24 -07001143 { "fracf", (void *)&SC_fracf,
1144 "float", "(float)" },
Jason Samsb0ec1b42009-07-28 12:02:16 -07001145 { "ceilf", (void *)&ceilf,
1146 "float", "(float)" },
Jason Samsd342fd72009-09-18 14:24:24 -07001147 { "roundf", (void *)&SC_roundf,
1148 "float", "(float)" },
Romain Guy8839ca52009-07-31 11:20:59 -07001149 { "expf", (void *)&expf,
1150 "float", "(float)" },
1151 { "logf", (void *)&logf,
1152 "float", "(float)" },
1153 { "powf", (void *)&powf,
1154 "float", "(float, float)" },
1155 { "maxf", (void *)&SC_maxf,
1156 "float", "(float, float)" },
1157 { "minf", (void *)&SC_minf,
1158 "float", "(float, float)" },
Romain Guy8f5c94b2009-08-08 18:30:19 -07001159 { "sqrt", (void *)&sqrt,
1160 "int", "(int)" },
Romain Guy8839ca52009-07-31 11:20:59 -07001161 { "sqrtf", (void *)&sqrtf,
1162 "float", "(float)" },
Romain Guy8f5c94b2009-08-08 18:30:19 -07001163 { "sqr", (void *)&SC_sqr,
1164 "int", "(int)" },
Romain Guy8839ca52009-07-31 11:20:59 -07001165 { "sqrf", (void *)&SC_sqrf,
1166 "float", "(float)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001167 { "sign", (void *)&SC_sign,
1168 "int", "(int)" },
1169 { "signf", (void *)&SC_signf,
1170 "float", "(float)" },
Romain Guya9d2d5e2009-08-09 17:04:54 -07001171 { "clamp", (void *)&SC_clamp,
1172 "int", "(int, int, int)" },
Romain Guy8839ca52009-07-31 11:20:59 -07001173 { "clampf", (void *)&SC_clampf,
1174 "float", "(float, float, float)" },
1175 { "distf2", (void *)&SC_distf2,
1176 "float", "(float, float, float, float)" },
1177 { "distf3", (void *)&SC_distf3,
1178 "float", "(float, float, float, float, float, float)" },
1179 { "magf2", (void *)&SC_magf2,
1180 "float", "(float, float)" },
1181 { "magf3", (void *)&SC_magf3,
1182 "float", "(float, float, float)" },
1183 { "radf", (void *)&SC_radf,
1184 "float", "(float)" },
1185 { "degf", (void *)&SC_degf,
1186 "float", "(float)" },
1187 { "lerpf", (void *)&SC_lerpf,
1188 "float", "(float, float, float)" },
1189 { "normf", (void *)&SC_normf,
1190 "float", "(float, float, float)" },
1191 { "mapf", (void *)&SC_mapf,
1192 "float", "(float, float, float, float, float)" },
Romain Guyecc7ca02009-08-03 21:12:51 -07001193 { "noisef", (void *)&SC_noisef,
1194 "float", "(float)" },
1195 { "noisef2", (void *)&SC_noisef2,
1196 "float", "(float, float)" },
1197 { "noisef3", (void *)&SC_noisef3,
1198 "float", "(float, float, float)" },
1199 { "turbulencef2", (void *)&SC_turbulencef2,
1200 "float", "(float, float, float)" },
1201 { "turbulencef3", (void *)&SC_turbulencef3,
1202 "float", "(float, float, float, float)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001203
Romain Guy584a3752009-07-30 18:45:01 -07001204 // time
1205 { "second", (void *)&SC_second,
1206 "int", "()" },
1207 { "minute", (void *)&SC_minute,
1208 "int", "()" },
1209 { "hour", (void *)&SC_hour,
1210 "int", "()" },
Romain Guy8839ca52009-07-31 11:20:59 -07001211 { "day", (void *)&SC_day,
1212 "int", "()" },
1213 { "month", (void *)&SC_month,
1214 "int", "()" },
1215 { "year", (void *)&SC_year,
1216 "int", "()" },
Joe Onorato3370ec92009-08-09 11:39:02 -07001217 { "uptimeMillis", (void*)&SC_uptimeMillis,
1218 "int", "()" }, // TODO: use long instead
1219 { "startTimeMillis", (void*)&SC_startTimeMillis,
1220 "int", "()" }, // TODO: use long instead
1221 { "elapsedTimeMillis", (void*)&SC_elapsedTimeMillis,
1222 "int", "()" }, // TODO: use long instead
Romain Guy584a3752009-07-30 18:45:01 -07001223
Jason Samsc97bb882009-07-20 14:31:06 -07001224 // matrix
1225 { "matrixLoadIdentity", (void *)&SC_matrixLoadIdentity,
1226 "void", "(float *mat)" },
1227 { "matrixLoadFloat", (void *)&SC_matrixLoadFloat,
1228 "void", "(float *mat, float *f)" },
1229 { "matrixLoadMat", (void *)&SC_matrixLoadMat,
1230 "void", "(float *mat, float *newmat)" },
1231 { "matrixLoadRotate", (void *)&SC_matrixLoadRotate,
1232 "void", "(float *mat, float rot, float x, float y, float z)" },
1233 { "matrixLoadScale", (void *)&SC_matrixLoadScale,
1234 "void", "(float *mat, float x, float y, float z)" },
1235 { "matrixLoadTranslate", (void *)&SC_matrixLoadTranslate,
1236 "void", "(float *mat, float x, float y, float z)" },
1237 { "matrixLoadMultiply", (void *)&SC_matrixLoadMultiply,
1238 "void", "(float *mat, float *lhs, float *rhs)" },
1239 { "matrixMultiply", (void *)&SC_matrixMultiply,
1240 "void", "(float *mat, float *rhs)" },
1241 { "matrixRotate", (void *)&SC_matrixRotate,
1242 "void", "(float *mat, float rot, float x, float y, float z)" },
1243 { "matrixScale", (void *)&SC_matrixScale,
1244 "void", "(float *mat, float x, float y, float z)" },
1245 { "matrixTranslate", (void *)&SC_matrixTranslate,
1246 "void", "(float *mat, float x, float y, float z)" },
1247
Jason Sams334ea0c2009-08-17 13:56:09 -07001248 // vector
1249 { "vec2Rand", (void *)&SC_vec2Rand,
1250 "void", "(float *vec, float maxLen)" },
1251
Jason Samsea84a7c2009-09-04 14:42:41 -07001252 // vec3
1253 { "vec3Norm", (void *)&SC_vec3Norm,
Jason Sams718cd1f2009-12-23 14:35:29 -08001254 "void", "(struct vecF32_3_s *)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001255 { "vec3Length", (void *)&SC_vec3Length,
Jason Sams718cd1f2009-12-23 14:35:29 -08001256 "float", "(struct vecF32_3_s *)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001257 { "vec3Add", (void *)&SC_vec3Add,
Jason Sams718cd1f2009-12-23 14:35:29 -08001258 "void", "(struct vecF32_3_s *dest, struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001259 { "vec3Sub", (void *)&SC_vec3Sub,
Jason Sams718cd1f2009-12-23 14:35:29 -08001260 "void", "(struct vecF32_3_s *dest, struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001261 { "vec3Cross", (void *)&SC_vec3Cross,
Jason Sams718cd1f2009-12-23 14:35:29 -08001262 "void", "(struct vecF32_3_s *dest, struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001263 { "vec3Dot", (void *)&SC_vec3Dot,
Jason Sams718cd1f2009-12-23 14:35:29 -08001264 "float", "(struct vecF32_3_s *lhs, struct vecF32_3_s *rhs)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001265 { "vec3Scale", (void *)&SC_vec3Scale,
Jason Sams718cd1f2009-12-23 14:35:29 -08001266 "void", "(struct vecF32_3_s *lhs, float scale)" },
Jason Samsea84a7c2009-09-04 14:42:41 -07001267
Romain Guyd7fa1222009-10-09 16:05:25 -07001268 // vec4
1269 { "vec4Norm", (void *)&SC_vec4Norm,
Jason Sams718cd1f2009-12-23 14:35:29 -08001270 "void", "(struct vecF32_4_s *)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001271 { "vec4Length", (void *)&SC_vec4Length,
Jason Sams718cd1f2009-12-23 14:35:29 -08001272 "float", "(struct vecF32_4_s *)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001273 { "vec4Add", (void *)&SC_vec4Add,
Jason Sams718cd1f2009-12-23 14:35:29 -08001274 "void", "(struct vecF32_4_s *dest, struct vecF32_4_s *lhs, struct vecF32_4_s *rhs)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001275 { "vec4Sub", (void *)&SC_vec4Sub,
Jason Sams718cd1f2009-12-23 14:35:29 -08001276 "void", "(struct vecF32_4_s *dest, struct vecF32_4_s *lhs, struct vecF32_4_s *rhs)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001277 { "vec4Dot", (void *)&SC_vec4Dot,
Jason Sams718cd1f2009-12-23 14:35:29 -08001278 "float", "(struct vecF32_4_s *lhs, struct vecF32_4_s *rhs)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001279 { "vec4Scale", (void *)&SC_vec4Scale,
Jason Sams718cd1f2009-12-23 14:35:29 -08001280 "void", "(struct vecF32_4_s *lhs, float scale)" },
Romain Guyd7fa1222009-10-09 16:05:25 -07001281
Jason Samsc97bb882009-07-20 14:31:06 -07001282 // context
1283 { "bindProgramFragment", (void *)&SC_bindProgramFragment,
1284 "void", "(int)" },
1285 { "bindProgramFragmentStore", (void *)&SC_bindProgramFragmentStore,
1286 "void", "(int)" },
Jason Sams5235cf32009-09-28 18:12:56 -07001287 { "bindProgramStore", (void *)&SC_bindProgramFragmentStore,
1288 "void", "(int)" },
Jason Samsee411122009-07-21 12:20:54 -07001289 { "bindProgramVertex", (void *)&SC_bindProgramVertex,
1290 "void", "(int)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001291 { "bindSampler", (void *)&SC_bindSampler,
1292 "void", "(int, int, int)" },
1293 { "bindTexture", (void *)&SC_bindTexture,
1294 "void", "(int, int, int)" },
1295
Jason Samsb0ec1b42009-07-28 12:02:16 -07001296 // vp
Jason Samsfaf15202009-07-29 20:55:44 -07001297 { "vpLoadModelMatrix", (void *)&SC_vpLoadModelMatrix,
Jason Samsb0ec1b42009-07-28 12:02:16 -07001298 "void", "(void *)" },
Jason Samsfaf15202009-07-29 20:55:44 -07001299 { "vpLoadTextureMatrix", (void *)&SC_vpLoadTextureMatrix,
Jason Samsb0ec1b42009-07-28 12:02:16 -07001300 "void", "(void *)" },
1301
1302
1303
Jason Samsc97bb882009-07-20 14:31:06 -07001304 // drawing
Jason Sams6f5c61c2009-07-28 17:20:11 -07001305 { "drawRect", (void *)&SC_drawRect,
1306 "void", "(float x1, float y1, float x2, float y2, float z)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001307 { "drawQuad", (void *)&SC_drawQuad,
1308 "void", "(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4)" },
Romain Guy8f5c94b2009-08-08 18:30:19 -07001309 { "drawQuadTexCoords", (void *)&SC_drawQuadTexCoords,
1310 "void", "(float x1, float y1, float z1, float u1, float v1, float x2, float y2, float z2, float u2, float v2, float x3, float y3, float z3, float u3, float v3, float x4, float y4, float z4, float u4, float v4)" },
Jason Samse9ad9a72009-09-30 17:36:20 -07001311 { "drawSprite", (void *)&SC_drawSprite,
1312 "void", "(float x, float y, float z, float w, float h)" },
1313 { "drawSpriteScreenspace", (void *)&SC_drawSpriteScreenspace,
1314 "void", "(float x, float y, float z, float w, float h)" },
Joe Onorato6656c1b2010-01-14 15:59:35 -05001315 { "drawSpriteScreenspaceCropped", (void *)&SC_drawSpriteScreenspaceCropped,
1316 "void", "(float x, float y, float z, float w, float h, float cx0, float cy0, float cx1, float cy1)" },
Romain Guy6c0cc6d2009-08-07 15:40:32 -07001317 { "drawLine", (void *)&SC_drawLine,
1318 "void", "(float x1, float y1, float z1, float x2, float y2, float z2)" },
Jason Sams5235cf32009-09-28 18:12:56 -07001319 { "drawPoint", (void *)&SC_drawPoint,
1320 "void", "(float x1, float y1, float z1)" },
Jason Sams1bada8c2009-08-09 17:01:55 -07001321 { "drawSimpleMesh", (void *)&SC_drawSimpleMesh,
1322 "void", "(int ism)" },
1323 { "drawSimpleMeshRange", (void *)&SC_drawSimpleMeshRange,
1324 "void", "(int ism, int start, int len)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001325
1326
1327 // misc
1328 { "pfClearColor", (void *)&SC_ClearColor,
1329 "void", "(float, float, float, float)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001330 { "color", (void *)&SC_color,
1331 "void", "(float, float, float, float)" },
Romain Guya32d1002009-07-31 15:33:59 -07001332 { "hsb", (void *)&SC_hsb,
1333 "void", "(float, float, float, float)" },
Romain Guyd22fff72009-08-20 17:08:33 -07001334 { "hsbToRgb", (void *)&SC_hsbToRgb,
1335 "void", "(float, float, float, float*)" },
1336 { "hsbToAbgr", (void *)&SC_hsbToAbgr,
1337 "int", "(float, float, float, float)" },
Romain Guyb62627e2009-08-06 22:52:13 -07001338 { "ambient", (void *)&SC_ambient,
1339 "void", "(float, float, float, float)" },
1340 { "diffuse", (void *)&SC_diffuse,
1341 "void", "(float, float, float, float)" },
1342 { "specular", (void *)&SC_specular,
1343 "void", "(float, float, float, float)" },
1344 { "emission", (void *)&SC_emission,
1345 "void", "(float, float, float, float)" },
1346 { "shininess", (void *)&SC_shininess,
Romain Guy6c0cc6d2009-08-07 15:40:32 -07001347 "void", "(float)" },
Romain Guy2d496bf2009-09-04 17:55:41 -07001348 { "pointAttenuation", (void *)&SC_pointAttenuation,
1349 "void", "(float, float, float)" },
Jason Samsc97bb882009-07-20 14:31:06 -07001350
Jason Samsb0ec1b42009-07-28 12:02:16 -07001351 { "uploadToTexture", (void *)&SC_uploadToTexture,
1352 "void", "(int, int)" },
Jason Sams1bada8c2009-08-09 17:01:55 -07001353 { "uploadToBufferObject", (void *)&SC_uploadToBufferObject,
1354 "void", "(int)" },
Jason Samsb0ec1b42009-07-28 12:02:16 -07001355
Jason Samsea87e962010-01-12 12:12:28 -08001356 { "syncToGL", (void *)&SC_syncToGL,
1357 "void", "(int)" },
1358
Jason Sams334ea0c2009-08-17 13:56:09 -07001359 { "colorFloatRGBAtoUNorm8", (void *)&SC_colorFloatRGBAtoUNorm8,
1360 "int", "(float, float, float, float)" },
1361 { "colorFloatRGBto565", (void *)&SC_colorFloatRGBAto565,
1362 "int", "(float, float, float)" },
1363
1364
Jason Sams40a29e82009-08-10 14:55:26 -07001365 { "getWidth", (void *)&SC_getWidth,
1366 "int", "()" },
1367 { "getHeight", (void *)&SC_getHeight,
1368 "int", "()" },
1369
Jason Sams516c3192009-10-06 13:58:47 -07001370 { "sendToClient", (void *)&SC_toClient,
1371 "int", "(void *data, int cmdID, int len, int waitForSpace)" },
Jason Sams40a29e82009-08-10 14:55:26 -07001372
Jason Samsb0ec1b42009-07-28 12:02:16 -07001373
1374 { "debugF", (void *)&SC_debugF,
1375 "void", "(void *, float)" },
1376 { "debugI32", (void *)&SC_debugI32,
1377 "void", "(void *, int)" },
Romain Guyd22fff72009-08-20 17:08:33 -07001378 { "debugHexF", (void *)&SC_debugHexF,
1379 "void", "(void *, float)" },
1380 { "debugHexI32", (void *)&SC_debugHexI32,
1381 "void", "(void *, int)" },
Jason Samsb0ec1b42009-07-28 12:02:16 -07001382
Jason Samsbd2197f2009-10-07 18:14:01 -07001383 { "scriptCall", (void *)&SC_scriptCall,
1384 "void", "(int)" },
1385
Jason Samsb0ec1b42009-07-28 12:02:16 -07001386
Jason Samsc97bb882009-07-20 14:31:06 -07001387 { NULL, NULL, NULL, NULL }
1388};
1389
1390const ScriptCState::SymbolTable_t * ScriptCState::lookupSymbol(const char *sym)
1391{
1392 ScriptCState::SymbolTable_t *syms = gSyms;
1393
1394 while (syms->mPtr) {
1395 if (!strcmp(syms->mName, sym)) {
1396 return syms;
1397 }
1398 syms++;
1399 }
1400 return NULL;
1401}
1402
1403void ScriptCState::appendDecls(String8 *str)
1404{
1405 ScriptCState::SymbolTable_t *syms = gSyms;
1406 while (syms->mPtr) {
1407 str->append(syms->mRet);
1408 str->append(" ");
1409 str->append(syms->mName);
1410 str->append(syms->mParam);
1411 str->append(";\n");
1412 syms++;
1413 }
1414}
1415
1416