| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** @file rs_math.rsh |
| * \brief todo-jsams |
| * |
| * todo-jsams |
| * |
| */ |
| |
| #ifndef __RS_MATH_RSH__ |
| #define __RS_MATH_RSH__ |
| |
| |
| /** |
| * Return a random value between 0 (or min_value) and max_malue. |
| */ |
| extern int __attribute__((overloadable)) |
| rsRand(int max_value); |
| /** |
| * \overload |
| */ |
| extern int __attribute__((overloadable)) |
| rsRand(int min_value, int max_value); |
| /** |
| * \overload |
| */ |
| extern float __attribute__((overloadable)) |
| rsRand(float max_value); |
| /** |
| * \overload |
| */ |
| extern float __attribute__((overloadable)) |
| rsRand(float min_value, float max_value); |
| |
| /** |
| * Returns the fractional part of a float |
| */ |
| extern float __attribute__((overloadable)) |
| rsFrac(float); |
| |
| |
| ///////////////////////////////////////////////////// |
| // int ops |
| ///////////////////////////////////////////////////// |
| |
| /** |
| * Clamp the value amount between low and high. |
| * |
| * @param amount The value to clamp |
| * @param low |
| * @param high |
| */ |
| _RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high); |
| |
| /** |
| * \overload |
| */ |
| _RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high); |
| /** |
| * \overload |
| */ |
| _RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high); |
| /** |
| * \overload |
| */ |
| _RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high); |
| /** |
| * \overload |
| */ |
| _RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high); |
| /** |
| * \overload |
| */ |
| _RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high); |
| |
| |
| /** |
| * Computes 6 frustum planes from the view projection matrix |
| * @param viewProj matrix to extract planes from |
| * @param left plane |
| * @param right plane |
| * @param top plane |
| * @param bottom plane |
| * @param near plane |
| * @param far plane |
| */ |
| __inline__ static void __attribute__((overloadable, always_inline)) |
| rsExtractFrustumPlanes(const rs_matrix4x4 *viewProj, |
| float4 *left, float4 *right, |
| float4 *top, float4 *bottom, |
| float4 *near, float4 *far) { |
| // x y z w = a b c d in the plane equation |
| left->x = viewProj->m[3] + viewProj->m[0]; |
| left->y = viewProj->m[7] + viewProj->m[4]; |
| left->z = viewProj->m[11] + viewProj->m[8]; |
| left->w = viewProj->m[15] + viewProj->m[12]; |
| |
| right->x = viewProj->m[3] - viewProj->m[0]; |
| right->y = viewProj->m[7] - viewProj->m[4]; |
| right->z = viewProj->m[11] - viewProj->m[8]; |
| right->w = viewProj->m[15] - viewProj->m[12]; |
| |
| top->x = viewProj->m[3] - viewProj->m[1]; |
| top->y = viewProj->m[7] - viewProj->m[5]; |
| top->z = viewProj->m[11] - viewProj->m[9]; |
| top->w = viewProj->m[15] - viewProj->m[13]; |
| |
| bottom->x = viewProj->m[3] + viewProj->m[1]; |
| bottom->y = viewProj->m[7] + viewProj->m[5]; |
| bottom->z = viewProj->m[11] + viewProj->m[9]; |
| bottom->w = viewProj->m[15] + viewProj->m[13]; |
| |
| near->x = viewProj->m[3] + viewProj->m[2]; |
| near->y = viewProj->m[7] + viewProj->m[6]; |
| near->z = viewProj->m[11] + viewProj->m[10]; |
| near->w = viewProj->m[15] + viewProj->m[14]; |
| |
| far->x = viewProj->m[3] - viewProj->m[2]; |
| far->y = viewProj->m[7] - viewProj->m[6]; |
| far->z = viewProj->m[11] - viewProj->m[10]; |
| far->w = viewProj->m[15] - viewProj->m[14]; |
| |
| float len = length(left->xyz); |
| *left /= len; |
| len = length(right->xyz); |
| *right /= len; |
| len = length(top->xyz); |
| *top /= len; |
| len = length(bottom->xyz); |
| *bottom /= len; |
| len = length(near->xyz); |
| *near /= len; |
| len = length(far->xyz); |
| *far /= len; |
| } |
| |
| /** |
| * Checks if a sphere is withing the 6 frustum planes |
| * @param sphere float4 representing the sphere |
| * @param left plane |
| * @param right plane |
| * @param top plane |
| * @param bottom plane |
| * @param near plane |
| * @param far plane |
| */ |
| __inline__ static bool __attribute__((overloadable, always_inline)) |
| rsIsSphereInFrustum(float4 *sphere, |
| float4 *left, float4 *right, |
| float4 *top, float4 *bottom, |
| float4 *near, float4 *far) { |
| |
| float distToCenter = dot(left->xyz, sphere->xyz) + left->w; |
| if (distToCenter < -sphere->w) { |
| return false; |
| } |
| distToCenter = dot(right->xyz, sphere->xyz) + right->w; |
| if (distToCenter < -sphere->w) { |
| return false; |
| } |
| distToCenter = dot(top->xyz, sphere->xyz) + top->w; |
| if (distToCenter < -sphere->w) { |
| return false; |
| } |
| distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w; |
| if (distToCenter < -sphere->w) { |
| return false; |
| } |
| distToCenter = dot(near->xyz, sphere->xyz) + near->w; |
| if (distToCenter < -sphere->w) { |
| return false; |
| } |
| distToCenter = dot(far->xyz, sphere->xyz) + far->w; |
| if (distToCenter < -sphere->w) { |
| return false; |
| } |
| return true; |
| } |
| |
| |
| /** |
| * Pack floating point (0-1) RGB values into a uchar4. The alpha component is |
| * set to 255 (1.0). |
| * |
| * @param r |
| * @param g |
| * @param b |
| * |
| * @return uchar4 |
| */ |
| _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b); |
| |
| /** |
| * Pack floating point (0-1) RGBA values into a uchar4. |
| * |
| * @param r |
| * @param g |
| * @param b |
| * @param a |
| * |
| * @return uchar4 |
| */ |
| _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a); |
| |
| /** |
| * Pack floating point (0-1) RGB values into a uchar4. The alpha component is |
| * set to 255 (1.0). |
| * |
| * @param color |
| * |
| * @return uchar4 |
| */ |
| _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color); |
| |
| /** |
| * Pack floating point (0-1) RGBA values into a uchar4. |
| * |
| * @param color |
| * |
| * @return uchar4 |
| */ |
| _RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color); |
| |
| /** |
| * Unpack a uchar4 color to float4. The resulting float range will be (0-1). |
| * |
| * @param c |
| * |
| * @return float4 |
| */ |
| _RS_RUNTIME float4 rsUnpackColor8888(uchar4 c); |
| |
| |
| #endif |