Now the theta = 0 should be on +x axis. And cos(theta) should correctly represent x value. Without this fix, the poly theta (from atan2) can be wrongly rotated 90 degrees. Also, make sure the incoming polygon is CW for the shadow system. This fix visual artifacts in recent regression for spot shadows. bug:13553955 Change-Id: I9bbf54db094e7f133326da4dae4610962da849c1
83 lines
3.4 KiB
C++
83 lines
3.4 KiB
C++
/*
|
|
* Copyright (C) 2014 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.
|
|
*/
|
|
|
|
#ifndef ANDROID_HWUI_SPOT_SHADOW_H
|
|
#define ANDROID_HWUI_SPOT_SHADOW_H
|
|
|
|
#include "Debug.h"
|
|
#include "Vector.h"
|
|
#include "VertexBuffer.h"
|
|
|
|
namespace android {
|
|
namespace uirenderer {
|
|
|
|
class SpotShadow {
|
|
public:
|
|
static VertexBufferMode createSpotShadow(bool isCasterOpaque, const Vector3* poly,
|
|
int polyLength, const Vector3& lightCenter, float lightSize,
|
|
int lightVertexCount, VertexBuffer& retStrips);
|
|
|
|
private:
|
|
static int calculateOccludedUmbra(const Vector2* umbra, int umbraLength,
|
|
const Vector3* poly, int polyLength, Vector2* occludedUmbra);
|
|
static void computeSpotShadow(bool isCasterOpaque, const Vector3* lightPoly,
|
|
int lightPolyLength, const Vector3& lightCenter, const Vector3* poly,
|
|
int polyLength, VertexBuffer& retstrips);
|
|
|
|
static void computeLightPolygon(int points, const Vector3& lightCenter,
|
|
float size, Vector3* ret);
|
|
|
|
static void smoothPolygon(int level, int rays, float* rayDist);
|
|
static float rayIntersectPoly(const Vector2* poly, int polyLength,
|
|
const Vector2& point, float dx, float dy);
|
|
|
|
static void xsort(Vector2* points, int pointsLength);
|
|
static int hull(Vector2* points, int pointsLength, Vector2* retPoly);
|
|
static bool ccw(double ax, double ay, double bx, double by, double cx, double cy);
|
|
static int intersection(const Vector2* poly1, int poly1length, Vector2* poly2, int poly2length);
|
|
static void sort(Vector2* poly, int polyLength, const Vector2& center);
|
|
|
|
static void swap(Vector2* points, int i, int j);
|
|
static void quicksortCirc(Vector2* points, int low, int high, const Vector2& center);
|
|
static void quicksortX(Vector2* points, int low, int high);
|
|
|
|
static bool testPointInsidePolygon(const Vector2 testPoint, const Vector2* poly, int len);
|
|
static void makeClockwise(Vector2* polygon, int len);
|
|
static void reverse(Vector2* polygon, int len);
|
|
static inline bool lineIntersection(double x1, double y1, double x2, double y2,
|
|
double x3, double y3, double x4, double y4, Vector2& ret);
|
|
|
|
static void generateTriangleStrip(bool isCasterOpaque, const Vector2* penumbra,
|
|
int penumbraLength, const Vector2* umbra, int umbraLength,
|
|
const Vector3* poly, int polyLength, VertexBuffer& retstrips);
|
|
|
|
#if DEBUG_SHADOW
|
|
// Verification utility function.
|
|
static bool testConvex(const Vector2* polygon, int polygonLength,
|
|
const char* name);
|
|
static void testIntersection(const Vector2* poly1, int poly1Length,
|
|
const Vector2* poly2, int poly2Length,
|
|
const Vector2* intersection, int intersectionLength);
|
|
static void updateBound(const Vector2 inVector, Vector2& lowerBound, Vector2& upperBound );
|
|
#endif
|
|
|
|
}; // SpotShadow
|
|
|
|
}; // namespace uirenderer
|
|
}; // namespace android
|
|
|
|
#endif // ANDROID_HWUI_SPOT_SHADOW_H
|