00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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