
/*
 * Copyright (C) 2013 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_SHADOW_TESSELLATOR_H
#define ANDROID_HWUI_SHADOW_TESSELLATOR_H

#include <SkPath.h>

#include "Debug.h"
#include "Matrix.h"

namespace android {
namespace uirenderer {

class VertexBuffer;

// All SHADOW_* are used to define all the geometry property of shadows.
// Use a simplified example to illustrate the geometry setup here.
// Assuming we use 6 rays and only 1 layer, Then we will have 2 hexagons, which
// are 0 to 5 and 6 to 11. The area between them will be the penumbra area, and
// the area inside the 2nd hexagon is the umbra.
// Ambient shadow is using only 1 layer for opaque caster, otherwise, spot
// shadow and ambient shadow are using 2 layers.
// Triange strip indices for penumbra area: (0, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 0, 6)
//                 0
//
//      5          6         1
//           11         7
//
//           10         8
//      4          9         2
//
//                 3

// The total number of rays starting from the centroid of shadow area, in order
// to generate the shadow geometry.
#define SHADOW_RAY_COUNT 128

// The total number of all the vertices representing the shadow.
// For the case we only have 1 layer, then we will just fill only 2/3 of it.
#define SHADOW_VERTEX_COUNT (3 * SHADOW_RAY_COUNT)

// The total number of indices used for drawing the shadow geometry as triangle strips.
// Depending on the mode we are drawing, we can have 1 layer or 2 layers.
// Therefore, we only build the longer index buffer.
#define TWO_POLY_RING_SHADOW_INDEX_COUNT (4 * (SHADOW_RAY_COUNT + 1))
#define ONE_POLY_RING_SHADOW_INDEX_COUNT (2 * (SHADOW_RAY_COUNT + 1))

#define MAX_SHADOW_INDEX_COUNT TWO_POLY_RING_SHADOW_INDEX_COUNT

#define SHADOW_MIN_CASTER_Z 0.001f

#define MINIMAL_DELTA_THETA (M_PI / 180 / 1000)

class ShadowTessellator {
public:
    static void tessellateAmbientShadow(bool isCasterOpaque, const Vector3* casterPolygon,
                                        int casterVertexCount, const Vector3& centroid3d,
                                        const Rect& casterBounds, const Rect& localClip, float maxZ,
                                        VertexBuffer& shadowVertexBuffer);

    static void tessellateSpotShadow(bool isCasterOpaque, const Vector3* casterPolygon,
                                     int casterVertexCount, const Vector3& casterCentroid,
                                     const mat4& receiverTransform, const Vector3& lightCenter,
                                     int lightRadius, const Rect& casterBounds,
                                     const Rect& localClip, VertexBuffer& shadowVertexBuffer);

    static Vector2 centroid2d(const Vector2* poly, int polyLength);

    static Vector2 calculateNormal(const Vector2& p1, const Vector2& p2);

    static int getExtraVertexNumber(const Vector2& vector1, const Vector2& vector2, float divisor);

    static void checkOverflow(int used, int total, const char* bufferName);
};  // ShadowTessellator

};  // namespace uirenderer
};  // namespace android

#endif  // ANDROID_HWUI_SHADOW_TESSELLATOR_H
