17b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui/* 27b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * Copyright (C) 2014 The Android Open Source Project 37b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * 47b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * Licensed under the Apache License, Version 2.0 (the "License"); 57b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * you may not use this file except in compliance with the License. 67b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * You may obtain a copy of the License at 77b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * 87b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * http://www.apache.org/licenses/LICENSE-2.0 97b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * 107b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * Unless required by applicable law or agreed to in writing, software 117b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * distributed under the License is distributed on an "AS IS" BASIS, 127b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * See the License for the specific language governing permissions and 147b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui * limitations under the License. 157b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui */ 167b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 177b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui#ifndef ANDROID_HWUI_SPOT_SHADOW_H 187b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui#define ANDROID_HWUI_SPOT_SHADOW_H 197b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 207b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui#include "Debug.h" 217b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui#include "Vector.h" 227b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 237b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghuinamespace android { 247b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghuinamespace uirenderer { 257b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 262dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudsonclass VertexBuffer; 272dc236b2bae13b9a0ed9b3f7320502aecd7983b3Tom Hudson 287b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghuiclass SpotShadow { 297b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghuipublic: 30c50a03d78aaedd0003377e98710e7038bda330e9ztenghui static void createSpotShadow(bool isCasterOpaque, const Vector3& lightCenter, 31c50a03d78aaedd0003377e98710e7038bda330e9ztenghui float lightSize, const Vector3* poly, int polyLength, 32c50a03d78aaedd0003377e98710e7038bda330e9ztenghui const Vector3& polyCentroid, VertexBuffer& retstrips); 337b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 347b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghuiprivate: 35512e643ce83b1d48ad9630a3622276f795cf4fb2ztenghui struct VertexAngleData; 36512e643ce83b1d48ad9630a3622276f795cf4fb2ztenghui 37c50a03d78aaedd0003377e98710e7038bda330e9ztenghui static float projectCasterToOutline(Vector2& outline, 38c50a03d78aaedd0003377e98710e7038bda330e9ztenghui const Vector3& lightCenter, const Vector3& polyVertex); 39c50a03d78aaedd0003377e98710e7038bda330e9ztenghui 407b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void computeLightPolygon(int points, const Vector3& lightCenter, 417b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui float size, Vector3* ret); 427b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 437b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void smoothPolygon(int level, int rays, float* rayDist); 447b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static float rayIntersectPoly(const Vector2* poly, int polyLength, 457b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui const Vector2& point, float dx, float dy); 467b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 477b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void xsort(Vector2* points, int pointsLength); 487b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static int hull(Vector2* points, int pointsLength, Vector2* retPoly); 499122b1b168d2a74d51517ed7282f4d6a8adea367ztenghui static bool ccw(float ax, float ay, float bx, float by, float cx, float cy); 507b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void sort(Vector2* poly, int polyLength, const Vector2& center); 517b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 527b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void swap(Vector2* points, int i, int j); 537b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void quicksortCirc(Vector2* points, int low, int high, const Vector2& center); 547b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void quicksortX(Vector2* points, int low, int high); 557b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 567b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static bool testPointInsidePolygon(const Vector2 testPoint, const Vector2* poly, int len); 577b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui static void reverse(Vector2* polygon, int len); 587b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 59c50a03d78aaedd0003377e98710e7038bda330e9ztenghui static void generateTriangleStrip(bool isCasterOpaque, float shadowStrengthScale, 60512e643ce83b1d48ad9630a3622276f795cf4fb2ztenghui Vector2* penumbra, int penumbraLength, Vector2* umbra, int umbraLength, 61512e643ce83b1d48ad9630a3622276f795cf4fb2ztenghui const Vector3* poly, int polyLength, VertexBuffer& retstrips, const Vector2& centroid); 627b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 63f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui#if DEBUG_SHADOW 64f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui static bool testConvex(const Vector2* polygon, int polygonLength, 65f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui const char* name); 66f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui static void testIntersection(const Vector2* poly1, int poly1Length, 67f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui const Vector2* poly2, int poly2Length, 68f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui const Vector2* intersection, int intersectionLength); 69f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui static void updateBound(const Vector2 inVector, Vector2& lowerBound, Vector2& upperBound ); 70c50a03d78aaedd0003377e98710e7038bda330e9ztenghui static void dumpPolygon(const Vector2* poly, int polyLength, const char* polyName); 71c50a03d78aaedd0003377e98710e7038bda330e9ztenghui static void dumpPolygon(const Vector3* poly, int polyLength, const char* polyName); 72f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui#endif 73f5ca8b4cb178008472e67fa0ae6a3e3fa75d7952ztenghui 747b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui}; // SpotShadow 757b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 767b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui}; // namespace uirenderer 777b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui}; // namespace android 787b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui 797b4516e7ea552ad08d6e7277d311ef11bd8f12e8ztenghui#endif // ANDROID_HWUI_SPOT_SHADOW_H 80