mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-15 07:20:31 +02:00
Found by the probe regression run on the first lighting probes: - The normal stays as the world matrix leaves it, and N.L and N.H are scaled by its GE reciprocal length, like the spot direction. Exact with scaled, sheared and rotated world matrices (gpu/probe exp3). - A negative factor (a spot pointing away with cutoff -1) scales the light by 0 instead of subtracting (exp3, exp4). - Shade mapping UVs use the same GE arithmetic as lighting (exp2-4). - The half vector uses the GE's add. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
77 lines
2.0 KiB
C++
77 lines
2.0 KiB
C++
// Copyright (c) 2013- PPSSPP Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#include "TransformUnit.h"
|
|
|
|
namespace Lighting {
|
|
|
|
struct State {
|
|
struct {
|
|
// Pre-normalized if directional.
|
|
Vec3f pos;
|
|
Vec3f att;
|
|
Vec3f spotDir;
|
|
float spotDirRsqrt;
|
|
float spotCutoff;
|
|
float spotExp;
|
|
|
|
Vec4<int> ambientColorFactor;
|
|
Vec4<int> diffuseColorFactor;
|
|
Vec4<int> specularColorFactor;
|
|
|
|
struct {
|
|
bool enabled : 1;
|
|
bool spot : 1;
|
|
bool directional : 1;
|
|
bool poweredDiffuse : 1;
|
|
bool ambient : 1;
|
|
bool diffuse : 1;
|
|
bool specular : 1;
|
|
};
|
|
} lights[4];
|
|
|
|
struct {
|
|
Vec4<int> ambientColorFactor;
|
|
Vec4<int> diffuseColorFactor;
|
|
Vec4<int> specularColorFactor;
|
|
} material;
|
|
|
|
Vec4<int> baseAmbientColorFactor;
|
|
float specularExp;
|
|
Vec3f viewDir;
|
|
|
|
struct {
|
|
bool colorForAmbient : 1;
|
|
bool colorForDiffuse : 1;
|
|
bool colorForSpecular : 1;
|
|
bool setColor1 : 1;
|
|
bool addColor1 : 1;
|
|
bool usesWorldPos : 1;
|
|
bool usesWorldNormal : 1;
|
|
};
|
|
};
|
|
|
|
void ComputeState(State *state, bool hasColor0);
|
|
|
|
// worldnormal isn't normalized; normalRsqrt is its reciprocal length.
|
|
void GenerateLightST(VertexData &vertex, const WorldCoords &worldpos, const WorldCoords &worldnormal, float normalRsqrt, const Vec3f &viewDir);
|
|
void Process(VertexData &vertex, const WorldCoords &worldpos, const WorldCoords &worldnormal, float normalRsqrt, const State &state);
|
|
|
|
}
|