2024-10-28 15:57:39 +01:00
|
|
|
// Luanti
|
|
|
|
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
// Copyright (C) 2021 Liso <anlismon@gmail.com>
|
2021-06-06 18:51:21 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "irrlichttypes_bloated.h"
|
|
|
|
#include <matrix4.h>
|
|
|
|
#include "util/basic_macros.h"
|
2022-02-20 00:04:48 +01:00
|
|
|
#include "constants.h"
|
2021-06-06 18:51:21 +02:00
|
|
|
|
|
|
|
class Camera;
|
|
|
|
class Client;
|
|
|
|
|
|
|
|
struct shadowFrustum
|
|
|
|
{
|
2022-04-07 22:13:50 +02:00
|
|
|
f32 zNear{0.0f};
|
|
|
|
f32 zFar{0.0f};
|
|
|
|
f32 length{0.0f};
|
|
|
|
f32 radius{0.0f};
|
2021-06-06 18:51:21 +02:00
|
|
|
core::matrix4 ProjOrthMat;
|
|
|
|
core::matrix4 ViewMat;
|
|
|
|
v3f position;
|
2022-04-07 22:13:50 +02:00
|
|
|
v3f player;
|
2021-07-25 12:36:23 +02:00
|
|
|
v3s16 camera_offset;
|
2021-06-06 18:51:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class DirectionalLight
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DirectionalLight(const u32 shadowMapResolution,
|
|
|
|
const v3f &position,
|
|
|
|
video::SColorf lightColor = video::SColor(0xffffffff),
|
|
|
|
f32 farValue = 100.0f);
|
|
|
|
~DirectionalLight() = default;
|
|
|
|
|
|
|
|
//DISABLE_CLASS_COPY(DirectionalLight)
|
|
|
|
|
2021-07-25 12:36:23 +02:00
|
|
|
void update_frustum(const Camera *cam, Client *client, bool force = false);
|
2021-06-06 18:51:21 +02:00
|
|
|
|
|
|
|
// when set direction is updated to negative normalized(direction)
|
|
|
|
void setDirection(v3f dir);
|
|
|
|
v3f getDirection() const{
|
|
|
|
return direction;
|
|
|
|
};
|
|
|
|
v3f getPosition() const;
|
2022-04-07 22:13:50 +02:00
|
|
|
v3f getPlayerPos() const;
|
|
|
|
v3f getFuturePlayerPos() const;
|
2021-06-06 18:51:21 +02:00
|
|
|
|
|
|
|
/// Gets the light's matrices.
|
|
|
|
const core::matrix4 &getViewMatrix() const;
|
|
|
|
const core::matrix4 &getProjectionMatrix() const;
|
2021-07-25 12:36:23 +02:00
|
|
|
const core::matrix4 &getFutureViewMatrix() const;
|
|
|
|
const core::matrix4 &getFutureProjectionMatrix() const;
|
2021-06-06 18:51:21 +02:00
|
|
|
core::matrix4 getViewProjMatrix();
|
|
|
|
|
2022-04-14 22:49:30 +02:00
|
|
|
/// Gets the light's maximum far value, i.e. the shadow boundary
|
2021-06-06 18:51:21 +02:00
|
|
|
f32 getMaxFarValue() const
|
|
|
|
{
|
2022-02-20 00:04:48 +01:00
|
|
|
return farPlane * BS;
|
2021-06-06 18:51:21 +02:00
|
|
|
}
|
|
|
|
|
2022-04-14 22:49:30 +02:00
|
|
|
/// Gets the current far value of the light
|
|
|
|
f32 getFarValue() const
|
|
|
|
{
|
|
|
|
return shadow_frustum.zFar;
|
|
|
|
}
|
|
|
|
|
2021-06-06 18:51:21 +02:00
|
|
|
|
|
|
|
/// Gets the light's color.
|
|
|
|
const video::SColorf &getLightColor() const
|
|
|
|
{
|
|
|
|
return diffuseColor;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Sets the light's color.
|
|
|
|
void setLightColor(const video::SColorf &lightColor)
|
|
|
|
{
|
|
|
|
diffuseColor = lightColor;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Gets the shadow map resolution for this light.
|
|
|
|
u32 getMapResolution() const
|
|
|
|
{
|
|
|
|
return mapRes;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool should_update_map_shadow{true};
|
|
|
|
|
2021-07-25 12:36:23 +02:00
|
|
|
void commitFrustum();
|
|
|
|
|
2021-06-06 18:51:21 +02:00
|
|
|
private:
|
|
|
|
void createSplitMatrices(const Camera *cam);
|
|
|
|
|
|
|
|
video::SColorf diffuseColor;
|
|
|
|
|
|
|
|
f32 farPlane;
|
|
|
|
u32 mapRes;
|
|
|
|
|
|
|
|
v3f pos;
|
|
|
|
v3f direction{0};
|
2022-11-20 21:28:01 +01:00
|
|
|
|
|
|
|
v3f last_cam_pos_world{0,0,0};
|
|
|
|
v3f last_look{0,1,0};
|
|
|
|
|
2021-06-06 18:51:21 +02:00
|
|
|
shadowFrustum shadow_frustum;
|
2021-07-25 12:36:23 +02:00
|
|
|
shadowFrustum future_frustum;
|
|
|
|
bool dirty{false};
|
2021-06-06 18:51:21 +02:00
|
|
|
};
|