1 /* 2 * Copyright (C) 2014 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 #ifndef ANDROID_HWUI_SPOT_SHADOW_H 18 #define ANDROID_HWUI_SPOT_SHADOW_H 19 20 #include "Debug.h" 21 #include "Vector.h" 22 #include "VertexBuffer.h" 23 24 namespace android { 25 namespace uirenderer { 26 27 class SpotShadow { 28 public: 29 static void createSpotShadow(bool isCasterOpaque, const Vector3& lightCenter, 30 float lightSize, const Vector3* poly, int polyLength, 31 const Vector3& polyCentroid, VertexBuffer& retstrips); 32 33 private: 34 struct VertexAngleData; 35 36 static float projectCasterToOutline(Vector2& outline, 37 const Vector3& lightCenter, const Vector3& polyVertex); 38 static int calculateOccludedUmbra(const Vector2* umbra, int umbraLength, 39 const Vector3* poly, int polyLength, Vector2* occludedUmbra); 40 41 static int setupAngleList(VertexAngleData* angleDataList, 42 int polyLength, const Vector2* polygon, const Vector2& centroid, 43 bool isPenumbra, const char* name); 44 45 static int convertPolysToVerticesPerRay( 46 bool hasOccludedUmbraArea, const Vector2* poly2d, int polyLength, 47 const Vector2* umbra, int umbraLength, const Vector2* penumbra, 48 int penumbraLength, const Vector2& centroid, 49 Vector2* umbraVerticesPerRay, Vector2* penumbraVerticesPerRay, 50 Vector2* occludedUmbraVerticesPerRay); 51 52 static bool checkClockwise(int maxIndex, int listLength, 53 VertexAngleData* angleList, const char* name); 54 55 static void calculateDistanceCounter(bool needsOffsetToUmbra, int angleLength, 56 const VertexAngleData* allVerticesAngleData, int* distances); 57 58 static void mergeAngleList(int maxUmbraAngleIndex, int maxPenumbraAngleIndex, 59 const VertexAngleData* umbraAngleList, int umbraLength, 60 const VertexAngleData* penumbraAngleList, int penumbraLength, 61 VertexAngleData* allVerticesAngleData); 62 63 static int setupPolyAngleList(float* polyAngleList, int polyAngleLength, 64 const Vector2* poly2d, const Vector2& centroid); 65 66 static bool checkPolyClockwise(int polyAngleLength, int maxPolyAngleIndex, 67 const float* polyAngleList); 68 69 static int getEdgeStartIndex(const int* offsets, int rayIndex, int totalRayNumber, 70 const VertexAngleData* allVerticesAngleData); 71 72 static int getPolyEdgeStartIndex(int maxPolyAngleIndex, int polyLength, 73 const float* polyAngleList, float rayAngle); 74 75 static void computeLightPolygon(int points, const Vector3& lightCenter, 76 float size, Vector3* ret); 77 78 static void smoothPolygon(int level, int rays, float* rayDist); 79 static float rayIntersectPoly(const Vector2* poly, int polyLength, 80 const Vector2& point, float dx, float dy); 81 82 static void xsort(Vector2* points, int pointsLength); 83 static int hull(Vector2* points, int pointsLength, Vector2* retPoly); 84 static bool ccw(double ax, double ay, double bx, double by, double cx, double cy); 85 static int intersection(const Vector2* poly1, int poly1length, Vector2* poly2, int poly2length); 86 static void sort(Vector2* poly, int polyLength, const Vector2& center); 87 88 static void swap(Vector2* points, int i, int j); 89 static void quicksortCirc(Vector2* points, int low, int high, const Vector2& center); 90 static void quicksortX(Vector2* points, int low, int high); 91 92 static bool testPointInsidePolygon(const Vector2 testPoint, const Vector2* poly, int len); 93 static void makeClockwise(Vector2* polygon, int len); 94 static void reverse(Vector2* polygon, int len); 95 static inline bool lineIntersection(double x1, double y1, double x2, double y2, 96 double x3, double y3, double x4, double y4, Vector2& ret); 97 98 static void generateTriangleStrip(bool isCasterOpaque, float shadowStrengthScale, 99 Vector2* penumbra, int penumbraLength, Vector2* umbra, int umbraLength, 100 const Vector3* poly, int polyLength, VertexBuffer& retstrips, const Vector2& centroid); 101 102 #if DEBUG_SHADOW 103 static bool testConvex(const Vector2* polygon, int polygonLength, 104 const char* name); 105 static void testIntersection(const Vector2* poly1, int poly1Length, 106 const Vector2* poly2, int poly2Length, 107 const Vector2* intersection, int intersectionLength); 108 static void updateBound(const Vector2 inVector, Vector2& lowerBound, Vector2& upperBound ); 109 static void dumpPolygon(const Vector2* poly, int polyLength, const char* polyName); 110 static void dumpPolygon(const Vector3* poly, int polyLength, const char* polyName); 111 #endif 112 113 }; // SpotShadow 114 115 }; // namespace uirenderer 116 }; // namespace android 117 118 #endif // ANDROID_HWUI_SPOT_SHADOW_H 119