blob: c8835979cfe388a1b9e696ed9461e67fd63b02e0 [file] [log] [blame]
Jim Van Verthc5903412016-11-17 15:27:09 -05001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrShadowGeoProc.h"
9
10#include "glsl/GrGLSLFragmentShaderBuilder.h"
11#include "glsl/GrGLSLGeometryProcessor.h"
12#include "glsl/GrGLSLUniformHandler.h"
13#include "glsl/GrGLSLVarying.h"
Chris Daltonc17bf322017-10-24 10:59:03 -060014#include "glsl/GrGLSLVertexGeoBuilder.h"
Jim Van Verthc5903412016-11-17 15:27:09 -050015
16class GrGLSLRRectShadowGeoProc : public GrGLSLGeometryProcessor {
17public:
18 GrGLSLRRectShadowGeoProc() {}
19
20 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
21 const GrRRectShadowGeoProc& rsgp = args.fGP.cast<GrRRectShadowGeoProc>();
22 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
23 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
24 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
Chris Dalton60283612018-02-14 13:38:14 -070025 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
Jim Van Verthc5903412016-11-17 15:27:09 -050026
27 // emit attributes
28 varyingHandler->emitAttributes(rsgp);
Jim Van Verthfb186392018-09-11 11:37:46 -040029 fragBuilder->codeAppend("half3 shadowParams;");
Jim Van Verthc5903412016-11-17 15:27:09 -050030 varyingHandler->addPassThroughAttribute(rsgp.inShadowParams(), "shadowParams");
31
32 // setup pass through color
33 varyingHandler->addPassThroughAttribute(rsgp.inColor(), args.fOutputColor);
34
35 // Setup position
Brian Salomon92be2f72018-06-19 14:33:47 -040036 this->writeOutputPosition(vertBuilder, gpArgs, rsgp.inPosition().name());
Jim Van Verthc5903412016-11-17 15:27:09 -050037
38 // emit transforms
39 this->emitTransforms(vertBuilder,
40 varyingHandler,
41 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -040042 rsgp.inPosition().asShaderVar(),
Jim Van Verthc5903412016-11-17 15:27:09 -050043 args.fFPCoordTransformHandler);
44
Ethan Nicholasf7b88202017-09-18 14:10:39 -040045 fragBuilder->codeAppend("half d = length(shadowParams.xy);");
46 fragBuilder->codeAppend("half distance = shadowParams.z * (1.0 - d);");
Jim Van Verthc5903412016-11-17 15:27:09 -050047
Jim Van Verthfb186392018-09-11 11:37:46 -040048 fragBuilder->codeAppend("half factor = 1.0 - clamp(distance, 0.0, 1.0);");
Jim Van Verthc5903412016-11-17 15:27:09 -050049 fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;");
Ethan Nicholasf7b88202017-09-18 14:10:39 -040050 fragBuilder->codeAppendf("%s = half4(factor);",
Jim Van Verthc5903412016-11-17 15:27:09 -050051 args.fOutputCoverage);
52 }
53
54 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc,
55 FPCoordTransformIter&& transformIter) override {
Brian Salomon05969092017-07-13 11:20:51 -040056 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
Jim Van Verthc5903412016-11-17 15:27:09 -050057 }
58
59private:
60 typedef GrGLSLGeometryProcessor INHERITED;
61};
62
63///////////////////////////////////////////////////////////////////////////////
64
Brian Salomon92be2f72018-06-19 14:33:47 -040065GrRRectShadowGeoProc::GrRRectShadowGeoProc() : INHERITED(kGrRRectShadowGeoProc_ClassID) {
66 this->setVertexAttributeCnt(3);
Jim Van Verthc5903412016-11-17 15:27:09 -050067}
68
Brian Salomon94efbf52016-11-29 13:43:05 -050069GrGLSLPrimitiveProcessor* GrRRectShadowGeoProc::createGLSLInstance(const GrShaderCaps&) const {
Jim Van Verthc5903412016-11-17 15:27:09 -050070 return new GrGLSLRRectShadowGeoProc();
71}
72
73///////////////////////////////////////////////////////////////////////////////
74
Brian Salomon92be2f72018-06-19 14:33:47 -040075constexpr GrPrimitiveProcessor::Attribute GrRRectShadowGeoProc::kInPosition;
76constexpr GrPrimitiveProcessor::Attribute GrRRectShadowGeoProc::kInColor;
77constexpr GrPrimitiveProcessor::Attribute GrRRectShadowGeoProc::kInShadowParams;
78
Jim Van Verthc5903412016-11-17 15:27:09 -050079GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrRRectShadowGeoProc);
80
Hal Canary6f6961e2017-01-31 13:50:44 -050081#if GR_TEST_UTILS
Jim Van Verthc5903412016-11-17 15:27:09 -050082sk_sp<GrGeometryProcessor> GrRRectShadowGeoProc::TestCreate(GrProcessorTestData* d) {
Brian Salomon05969092017-07-13 11:20:51 -040083 return GrRRectShadowGeoProc::Make();
Jim Van Verthc5903412016-11-17 15:27:09 -050084}
Hal Canary6f6961e2017-01-31 13:50:44 -050085#endif