skia2/include/core/SkLights.h
robertphillips adf5afa628 Add SampleApp slide with animating lightmapped objects & transparency
This is pulled out of the drawLitAtlas CL (may it someday land). It does nicely demonstrate animating normal mapped objects and normal maps combined with partially transparent diffuse textures.

It is a crude Asteroids game.

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2026393005

TBR=reed@google.com

Review-Url: https://codereview.chromium.org/2026393005
2016-06-03 10:12:08 -07:00

87 lines
2.0 KiB
C++

/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkLights_DEFINED
#define SkLights_DEFINED
#include "SkPoint3.h"
#include "SkRefCnt.h"
#include "../private/SkTDArray.h"
class SK_API SkLights : public SkRefCnt {
public:
class Light {
public:
enum LightType {
kAmbient_LightType, // only 'fColor' is used
kDirectional_LightType
};
Light(const SkColor3f& color)
: fType(kAmbient_LightType)
, fColor(color) {
fDirection.set(0.0f, 0.0f, 1.0f);
}
Light(const SkColor3f& color, const SkVector3& dir)
: fType(kDirectional_LightType)
, fColor(color)
, fDirection(dir) {
if (!fDirection.normalize()) {
fDirection.set(0.0f, 0.0f, 1.0f);
}
}
LightType type() const { return fType; }
const SkColor3f& color() const { return fColor; }
const SkVector3& dir() const {
SkASSERT(kAmbient_LightType != fType);
return fDirection;
}
private:
LightType fType;
SkColor3f fColor; // linear (unpremul) color. Range is 0..1 in each channel.
SkVector3 fDirection; // direction towards the light (+Z is out of the screen).
// If degenerate, it will be replaced with (0, 0, 1).
};
class Builder {
public:
Builder() : fLights(new SkLights) { }
void add(const Light& light) {
if (fLights) {
*fLights->fLights.push() = light;
}
}
sk_sp<SkLights> finish() {
return fLights;
}
private:
sk_sp<SkLights> fLights;
};
int numLights() const {
return fLights.count();
}
const Light& light(int index) const {
return fLights[index];
}
private:
SkLights() {}
SkTDArray<Light> fLights;
};
#endif