Program Listing for File WebSceneDirectionalLight.h#
↰ Return to documentation for file (include/Karana/WebScene/WebSceneDirectionalLight.h)
/*
* Copyright (c) 2024-2026 Karana Dynamics Pty Ltd. All rights reserved.
*
* NOTICE TO USER:
*
* This source code and/or documentation (the "Licensed Materials") is
* the confidential and proprietary information of Karana Dynamics Inc.
* Use of these Licensed Materials is governed by the terms and conditions
* of a separate software license agreement between Karana Dynamics and the
* Licensee ("License Agreement"). Unless expressly permitted under that
* agreement, any reproduction, modification, distribution, or disclosure
* of the Licensed Materials, in whole or in part, to any third party
* without the prior written consent of Karana Dynamics is strictly prohibited.
*
* THE LICENSED MATERIALS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
* KARANA DYNAMICS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, AND
* FITNESS FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL KARANA DYNAMICS BE LIABLE FOR ANY DAMAGES WHATSOEVER,
* INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS, DATA, OR USE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, WHETHER IN CONTRACT, TORT,
* OR OTHERWISE ARISING OUT OF OR IN CONNECTION WITH THE LICENSED MATERIALS.
*
* U.S. Government End Users: The Licensed Materials are a "commercial item"
* as defined at 48 C.F.R. 2.101, and are provided to the U.S. Government
* only as a commercial end item under the terms of this license.
*
* Any use of the Licensed Materials in individual or commercial software must
* include, in the user documentation and internal source code comments,
* this Notice, Disclaimer, and U.S. Government Use Provision.
*/
/**
* @file
* @brief Contains the WebSceneDirectionalLight class.
*/
#pragma once
#include "Karana/Scene/Color.h"
#include "Karana/WebScene/Shadow.h"
#include "Karana/WebScene/WebSceneNode.h"
namespace Karana::Scene {
/**
* @class WebSceneDirectionalLight
* @brief Specialized node to provide a viewpoint for the WebScene
*
* See \sref{scene_layer_sec} for more discussion on
* the scene layer.
*/
class WebSceneDirectionalLight : public WebSceneNode {
public:
/**
* @brief WebSceneDirectionalLight constructor. The constructor is not meant to be called
* directly. Please use the create(...) method instead to create an instance.
* @param name Name for the WebSceneDirectionalLight
* @param scene WebScene to add the camera to.
* @param server Server to communicate with frontends
* @param batching Whether transform updates are being batched.
* @param color Color of the light.
* @param intensity Intensity of the light.
*/
WebSceneDirectionalLight(std::string_view name,
const Karana::Core::ks_ptr<Scene> &scene,
const Karana::Core::ks_ptr<Karana::WebUI::Server> &server,
bool *batching,
const Color &color,
float intensity);
/**
* @brief Create a new WebSceneDirectionalLight
* @param name Name for the WebSceneDirectionalLight
* @param scene WebScene to add the camera to.
* @param color Color of the light.
* @param intensity Intensity of the light.
* @return A pointer to the new light.
*/
static Karana::Core::ks_ptr<WebSceneDirectionalLight>
create(std::string_view name,
const Karana::Core::ks_ptr<WebScene> &scene,
const Color &color = Color::WHITE,
float intensity = 1);
/**
* @brief Get the light color
* @return The light color
*/
const Color &getColor();
/**
* @brief Set the light color
* @param color The light color
*/
void setColor(const Color &color);
/**
* @brief Get the light intensity
* @return The light intensity
*/
float getIntensity();
/**
* @brief Set the light intensity
* @param intensity The light intensity
*/
void setIntensity(float intensity);
/**
* @brief Enable and configure shadow casting for this light
* @param intensity Shadow intensity in the range [0, 1]
* @param pixels Pixel dimensions of the square shadow map
* @param radius Radius of shadow camera frustum cross-section
* @param near Minimum distance to cast shadows
* @param far Maximum distance to cast shadows
*/
void setShadows(float intensity = 1.0,
int pixels = 2048,
float radius = 10.0,
float near = 1e-3,
float far = 1e11);
/**
* @brief Disable shadow casting for this light
*/
void clearShadows();
/**
* @brief Set a target node to point the light at
* @param target The target node
*/
void setTarget(const Karana::Core::ks_ptr<WebSceneNode> &target);
protected:
/**
* @brief Discard the provided WebSceneDirectionalLight
* @param base - Base pointer to the WebSceneDirectionalLight.
*/
void _discard(Karana::Core::ks_ptr<Karana::Core::Base> &base) override;
private:
friend class WebScene;
void _ioHandleConn(Karana::WebUI::Connection &conn) const override;
void _ioSendCreateDirectionalLightMsg(
const std::function<void(const uint8_t *data, size_t len)> &send) const;
void
_ioSendSetLightColorMsg(const std::function<void(const uint8_t *data, size_t len)> &send,
const Color &color) const;
void _ioSendSetLightIntensityMsg(
const std::function<void(const uint8_t *data, size_t len)> &send,
float intensity) const;
void _ioSendSetLightShadowMsg(
const std::function<void(const uint8_t *data, size_t len)> &send) const;
void _ioSendSetDirectionalLightTargetMsg(
const std::function<void(const uint8_t *data, size_t len)> &send,
const Karana::Core::id_t &target_id) const;
Color _color;
float _intensity;
// Duplicate members for safe access from background thread
Color _io_color;
float _io_intensity;
Karana::Core::id_t _io_target_id = 0;
std::optional<Shadow> _io_shadow = std::nullopt;
};
} // namespace Karana::Scene