rs_math.rsh
Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2011 The Android Open Source Project
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00024 #ifndef __RS_MATH_RSH__
00025 #define __RS_MATH_RSH__
00026 
00027 
00031 extern int __attribute__((overloadable))
00032     rsRand(int max_value);
00036 extern int __attribute__((overloadable))
00037     rsRand(int min_value, int max_value);
00041 extern float __attribute__((overloadable))
00042     rsRand(float max_value);
00046 extern float __attribute__((overloadable))
00047     rsRand(float min_value, float max_value);
00048 
00052 extern float __attribute__((overloadable))
00053     rsFrac(float);
00054 
00055 
00057 // int ops
00059 
00067 _RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high);
00068 
00072 _RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high);
00076 _RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high);
00080 _RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high);
00084 _RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high);
00088 _RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high);
00089 
00090 
00101 __inline__ static void __attribute__((overloadable, always_inline))
00102 rsExtractFrustumPlanes(const rs_matrix4x4 *viewProj,
00103                          float4 *left, float4 *right,
00104                          float4 *top, float4 *bottom,
00105                          float4 *near, float4 *far) {
00106     // x y z w = a b c d in the plane equation
00107     left->x = viewProj->m[3] + viewProj->m[0];
00108     left->y = viewProj->m[7] + viewProj->m[4];
00109     left->z = viewProj->m[11] + viewProj->m[8];
00110     left->w = viewProj->m[15] + viewProj->m[12];
00111 
00112     right->x = viewProj->m[3] - viewProj->m[0];
00113     right->y = viewProj->m[7] - viewProj->m[4];
00114     right->z = viewProj->m[11] - viewProj->m[8];
00115     right->w = viewProj->m[15] - viewProj->m[12];
00116 
00117     top->x = viewProj->m[3] - viewProj->m[1];
00118     top->y = viewProj->m[7] - viewProj->m[5];
00119     top->z = viewProj->m[11] - viewProj->m[9];
00120     top->w = viewProj->m[15] - viewProj->m[13];
00121 
00122     bottom->x = viewProj->m[3] + viewProj->m[1];
00123     bottom->y = viewProj->m[7] + viewProj->m[5];
00124     bottom->z = viewProj->m[11] + viewProj->m[9];
00125     bottom->w = viewProj->m[15] + viewProj->m[13];
00126 
00127     near->x = viewProj->m[3] + viewProj->m[2];
00128     near->y = viewProj->m[7] + viewProj->m[6];
00129     near->z = viewProj->m[11] + viewProj->m[10];
00130     near->w = viewProj->m[15] + viewProj->m[14];
00131 
00132     far->x = viewProj->m[3] - viewProj->m[2];
00133     far->y = viewProj->m[7] - viewProj->m[6];
00134     far->z = viewProj->m[11] - viewProj->m[10];
00135     far->w = viewProj->m[15] - viewProj->m[14];
00136 
00137     float len = length(left->xyz);
00138     *left /= len;
00139     len = length(right->xyz);
00140     *right /= len;
00141     len = length(top->xyz);
00142     *top /= len;
00143     len = length(bottom->xyz);
00144     *bottom /= len;
00145     len = length(near->xyz);
00146     *near /= len;
00147     len = length(far->xyz);
00148     *far /= len;
00149 }
00150 
00161 __inline__ static bool __attribute__((overloadable, always_inline))
00162 rsIsSphereInFrustum(float4 *sphere,
00163                       float4 *left, float4 *right,
00164                       float4 *top, float4 *bottom,
00165                       float4 *near, float4 *far) {
00166 
00167     float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
00168     if (distToCenter < -sphere->w) {
00169         return false;
00170     }
00171     distToCenter = dot(right->xyz, sphere->xyz) + right->w;
00172     if (distToCenter < -sphere->w) {
00173         return false;
00174     }
00175     distToCenter = dot(top->xyz, sphere->xyz) + top->w;
00176     if (distToCenter < -sphere->w) {
00177         return false;
00178     }
00179     distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
00180     if (distToCenter < -sphere->w) {
00181         return false;
00182     }
00183     distToCenter = dot(near->xyz, sphere->xyz) + near->w;
00184     if (distToCenter < -sphere->w) {
00185         return false;
00186     }
00187     distToCenter = dot(far->xyz, sphere->xyz) + far->w;
00188     if (distToCenter < -sphere->w) {
00189         return false;
00190     }
00191     return true;
00192 }
00193 
00194 
00205 _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b);
00206 
00217 _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a);
00218 
00227 _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color);
00228 
00236 _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color);
00237 
00245 _RS_RUNTIME float4 rsUnpackColor8888(uchar4 c);
00246 
00247 
00248 #endif
Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License. The original page is available here.