blob: 3181f9bebb81062ae3af50c60d8334033ca0ac3f [file] [log] [blame]
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001/*
2 * Copyright 2019 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#include <renderengine/Mesh.h>
18
19#include <math/vec4.h>
20
21#include <ui/Rect.h>
22#include <ui/Transform.h>
23
24#include "GLShadowVertexGenerator.h"
25
26namespace android {
27namespace renderengine {
28namespace gl {
29
30GLShadowVertexGenerator::GLShadowVertexGenerator(const FloatRect& casterRect,
31 float casterCornerRadius, float casterZ,
32 bool casterIsTranslucent, const vec4& ambientColor,
33 const vec4& spotColor, const vec3& lightPosition,
34 float lightRadius) {
35 mDrawAmbientShadow = ambientColor.a > 0.f;
36 mDrawSpotShadow = spotColor.a > 0.f;
37
38 // Generate geometries and find number of vertices to generate
39 if (mDrawAmbientShadow) {
40 mAmbientShadowGeometry = getAmbientShadowGeometry(casterRect, casterCornerRadius, casterZ,
41 casterIsTranslucent, ambientColor);
42 mAmbientShadowVertexCount = getVertexCountForGeometry(*mAmbientShadowGeometry.get());
43 mAmbientShadowIndexCount = getIndexCountForGeometry(*mAmbientShadowGeometry.get());
44 } else {
45 mAmbientShadowVertexCount = 0;
46 mAmbientShadowIndexCount = 0;
47 }
48
49 if (mDrawSpotShadow) {
50 mSpotShadowGeometry =
51 getSpotShadowGeometry(casterRect, casterCornerRadius, casterZ, casterIsTranslucent,
52 spotColor, lightPosition, lightRadius);
53 mSpotShadowVertexCount = getVertexCountForGeometry(*mSpotShadowGeometry.get());
54 mSpotShadowIndexCount = getIndexCountForGeometry(*mSpotShadowGeometry.get());
55 } else {
56 mSpotShadowVertexCount = 0;
57 mSpotShadowIndexCount = 0;
58 }
59}
60
61size_t GLShadowVertexGenerator::getVertexCount() const {
62 return mAmbientShadowVertexCount + mSpotShadowVertexCount;
63}
64
65size_t GLShadowVertexGenerator::getIndexCount() const {
66 return mAmbientShadowIndexCount + mSpotShadowIndexCount;
67}
68
69void GLShadowVertexGenerator::fillVertices(Mesh::VertexArray<vec2>& position,
70 Mesh::VertexArray<vec4>& color,
71 Mesh::VertexArray<vec3>& params) const {
72 if (mDrawAmbientShadow) {
73 fillVerticesForGeometry(*mAmbientShadowGeometry.get(), mAmbientShadowVertexCount, position,
74 color, params);
75 }
76 if (mDrawSpotShadow) {
77 fillVerticesForGeometry(*mSpotShadowGeometry.get(), mSpotShadowVertexCount,
78 Mesh::VertexArray<vec2>(position, mAmbientShadowVertexCount),
79 Mesh::VertexArray<vec4>(color, mAmbientShadowVertexCount),
80 Mesh::VertexArray<vec3>(params, mAmbientShadowVertexCount));
81 }
82}
83
84void GLShadowVertexGenerator::fillIndices(uint16_t* indices) const {
85 if (mDrawAmbientShadow) {
86 fillIndicesForGeometry(*mAmbientShadowGeometry.get(), mAmbientShadowIndexCount,
87 0 /* starting vertex offset */, indices);
88 }
89 if (mDrawSpotShadow) {
90 fillIndicesForGeometry(*mSpotShadowGeometry.get(), mSpotShadowIndexCount,
91 mAmbientShadowVertexCount /* starting vertex offset */,
92 &(indices[mAmbientShadowIndexCount]));
93 }
94}
95
96} // namespace gl
97} // namespace renderengine
98} // namespace android