17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-31 08:50:52 +01:00

Add the optional LightOnly of FreeSpotLight

This commit is contained in:
2026-10-28 21:50:08 +01:00
parent 8c6a47f42c
commit 91c6324965
4 changed files with 14 additions and 3 deletions

View File

@@ -227,6 +227,7 @@ inline void readMatrix(cParser &parser, float4x4 &matrix)
static constexpr std::uint32_t E3D_LIGHT_SHADESELF{0x1};
static constexpr std::uint32_t E3D_LIGHT_NOSHADOWS{0x2};
static constexpr std::uint32_t E3D_LIGHT_SOFTFALLOFF{0x4};
static constexpr std::uint32_t E3D_LIGHT_LIGHTONLY{0x8};
// a light point whose cone takes the whole sphere (FalloffAngle 360) is a point light: it shines and is seen all around
static void point_light_cones(float &Falloff, float &Hotspot)
@@ -377,7 +378,7 @@ std::pair<int, int> TSubModel::Load(cParser &parser, bool dynamic)
>> discard >> fCosHotspotAngle; // kąt liczony dla średnicy, a nie promienia
// opcjonalne parametry, każdy to nazwa i wartość, w dowolnej kolejności: natężenie światła w procentach (hotspotpower:),
// promień kuli świecącej (radius:), cienie od własnego modelu (shadeself:), rzucanie cieni (castshadows:), spadek natężenia
// jak przy soft falloff blendera (softfalloff:). trzeba pobrać do kolejki 2 tokeny; jeśli to nie żaden z nich, zostają w
// jak przy soft falloff blendera (softfalloff:), samo oświetlenie bez punktu i poświaty (lightonly:). trzeba pobrać do kolejki 2 tokeny; jeśli to nie żaden z nich, zostają w
// kolejce dla odczytu zasięgu widoczności, który przywraca autoclear
while (true)
{
@@ -421,6 +422,10 @@ std::pair<int, int> TSubModel::Load(cParser &parser, bool dynamic)
{
parser >> discard >> bSoftFalloff;
}
else if (key == "lightonly:")
{
parser >> discard >> bLightOnly;
}
else
{
parser.autoclear(false);
@@ -1976,7 +1981,7 @@ void TSubModel::serialize(std::ostream &s, std::vector<TSubModel *> &models, std
sn_utils::ls_float32(s, fHotspotPower);
// the optional parameters of light points. the zeros of the fill of older files are their defaults
sn_utils::ls_float32(s, fLightRadius);
sn_utils::ls_uint32(s, (bShadeSelf ? E3D_LIGHT_SHADESELF : 0u) | (bCastShadows ? 0u : E3D_LIGHT_NOSHADOWS) | (bSoftFalloff ? E3D_LIGHT_SOFTFALLOFF : 0u));
sn_utils::ls_uint32(s, (bShadeSelf ? E3D_LIGHT_SHADESELF : 0u) | (bCastShadows ? 0u : E3D_LIGHT_NOSHADOWS) | (bSoftFalloff ? E3D_LIGHT_SOFTFALLOFF : 0u) | (bLightOnly ? E3D_LIGHT_LIGHTONLY : 0u));
// fill empty space
size_t fill = end - s.tellp();
@@ -2164,6 +2169,7 @@ void TSubModel::deserialize(std::istream &s)
bShadeSelf = (lightflags & E3D_LIGHT_SHADESELF) != 0;
bCastShadows = (lightflags & E3D_LIGHT_NOSHADOWS) == 0;
bSoftFalloff = (lightflags & E3D_LIGHT_SOFTFALLOFF) != 0;
bLightOnly = (lightflags & E3D_LIGHT_LIGHTONLY) != 0;
// necessary rotations were already done during t3d->e3d conversion
m_rotation_init_done = true;

View File

@@ -132,6 +132,7 @@ public:
bool bShadeSelf { false }; // cienie światła rzuca także model, do którego ono należy (shadeself:)
bool bCastShadows { true }; // światło rzuca cienie (castshadows:)
bool bSoftFalloff { false }; // natężenie maleje jak 1 / (d^2 + r^2), jak przy soft falloff blendera, zamiast świecenia z powierzchni kuli (softfalloff:)
bool bLightOnly { false }; // tylko oświetlenie: bez świecącego punktu i poświaty, widocznych z daleka (lightonly:)
float fCosViewAngle { 0.0f }; // cos kata pod jakim sie teraz patrzy
bool m_rotation_init_done = false;