15abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick/*
25abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Copyright (C) 2010 Google Inc. All rights reserved.
35abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
45abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * Redistribution and use in source and binary forms, with or without
55abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * modification, are permitted provided that the following conditions
65abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * are met:
75abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
85abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 1.  Redistributions of source code must retain the above copyright
95abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     notice, this list of conditions and the following disclaimer.
105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * 2.  Redistributions in binary form must reproduce the above copyright
115abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     notice, this list of conditions and the following disclaimer in the
125abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *     documentation and/or other materials provided with the distribution.
135abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick *
145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick */
255abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#ifndef LoopBlinnTextureCoords_h
275abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#define LoopBlinnTextureCoords_h
285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "FloatPoint3D.h"
305abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "LoopBlinnClassifier.h"
315abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "LoopBlinnConstants.h"
325abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
335abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include <wtf/Noncopyable.h>
345abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
355abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricknamespace WebCore {
365abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
375abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Computes three-dimensional texture coordinates for the control
385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// points of a cubic curve for rendering via the shader in "Rendering
395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick// Vector Art on the GPU" by Loop and Blinn, GPU Gems 3, Chapter 25.
405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickclass LoopBlinnTextureCoords {
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickpublic:
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Container for the cubic texture coordinates and other associated
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // information.
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    struct Result {
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        Result()
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            : isLineOrPoint(false)
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            , hasRenderingArtifact(false)
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick            , subdivisionParameterValue(0.0f) { }
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // The (k, l, m) texture coordinates that are to be associated
515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // with the four control points of the cubic curve.
525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        FloatPoint3D klmCoordinates[4];
535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // Indicates whether the curve is a line or a point, in which case
555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // we do not need to add its triangles to the mesh.
565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        bool isLineOrPoint;
575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // For the loop case, indicates whether a rendering artifact was
595abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // detected, in which case the curve needs to be further
605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // subdivided.
615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        bool hasRenderingArtifact;
625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
635abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // If a rendering artifact will occur for the given loop curve,
645abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // this is the parameter value (0 <= value <= 1) at which the
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        // curve needs to be subdivided to fix the artifact.
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        float subdivisionParameterValue;
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    };
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Computes the texture coordinates for a cubic curve segment's
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // control points, given the classification of the curve as well as
715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // an indication of which side is to be filled.
725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    static Result compute(const LoopBlinnClassifier::Result& classification,
735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick                          LoopBlinnConstants::FillSide sideToFill);
745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickprivate:
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // This class does not need to be instantiated.
775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    LoopBlinnTextureCoords() { }
785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick};
795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick} // namespace WebCore
815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif // LoopBlinnTextureCoords_h
83