141 lines
5.3 KiB
Plaintext
141 lines
5.3 KiB
Plaintext
/**
|
|
*
|
|
* RenderPipeline
|
|
*
|
|
* Copyright (c) 2014-2016 tobspr <tobias.springer1@gmail.com>
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
|
|
/**
|
|
* @brief Returns the maximum light index
|
|
* @details This returns the maximum light index (also called slot). Any lights
|
|
* after that slot are guaranteed to be zero-lights. This is useful when
|
|
* iterating over the list of lights, because iteration can be stopped when
|
|
* the maximum light index is reached.
|
|
*
|
|
* The maximum light index points to the last slot which is used. If no lights
|
|
* are attached, -1 is returned. If one light is attached at slot 0, the index
|
|
* is 0, if two are attached at the slots 0 and 1, the index is 1, and so on.
|
|
*
|
|
* If, for example, two lights are attached at the slots 2 and 5, then the
|
|
* index will be 5. Keep in mind that the max-index is not an indicator for
|
|
* how many lights are attached. Also, zero lights still may occur when iterating
|
|
* over the light lists
|
|
*
|
|
* @return Maximum light index
|
|
*/
|
|
inline int InternalLightManager::get_max_light_index() const {
|
|
return _lights.get_max_index();
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the amount of stored lights.
|
|
* @details This returns the amount of stored lights. This behaves unlike
|
|
* InternalLightManager::get_max_light_index, and instead returns the true
|
|
* amount of lights, which is completely unrelated to the amount of used slots.
|
|
*
|
|
* @return Amount of stored lights
|
|
*/
|
|
inline size_t InternalLightManager::get_num_lights() const {
|
|
return _lights.get_num_entries();
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the amount of shadow sources.
|
|
* @details This returns the total amount of stored shadow sources. This does
|
|
* not denote the amount of updated sources, but instead takes into account
|
|
* all sources, even those out of frustum.
|
|
* @return Amount of shadow sources.
|
|
*/
|
|
inline size_t InternalLightManager::get_num_shadow_sources() const {
|
|
return _shadow_sources.get_num_entries();
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the handle to the shadow manager
|
|
* @details This sets the handle to the global shadow manager. It is usually
|
|
* constructed on the python side, so we need to get a handle to it.
|
|
*
|
|
* The manager should be a handle to a ShadowManager instance, and will be
|
|
* stored somewhere on the python side most likely. The light manager does not
|
|
* keep a reference to it, so the python side should make sure to keep one.
|
|
*
|
|
* Be sure to call this before the InternalLightManager::update() method is
|
|
* called, otherwise an assertion will get triggered.
|
|
*
|
|
* @param mgr The ShadowManager instance
|
|
*/
|
|
inline void InternalLightManager::set_shadow_manager(ShadowManager* mgr) {
|
|
_shadow_manager = mgr;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets a handle to the command list
|
|
* @details This sets a handle to the global GPUCommandList. This is required to
|
|
* emit GPUCommands, which are used for attaching and detaching lights, as well
|
|
* as shadow source updates.
|
|
*
|
|
* The cmd_list should be a handle to a GPUCommandList handle, and will be
|
|
* stored somewhere on the python side most likely. The light manager does not
|
|
* keep a reference to it, so the python side should make sure to keep one.
|
|
*
|
|
* Be sure to call this before the InternalLightManager::update() method is
|
|
* called, otherwise an assertion will get triggered.
|
|
*
|
|
* @param cmd_list The GPUCommandList instance
|
|
*/
|
|
inline void InternalLightManager::set_command_list(GPUCommandList *cmd_list) {
|
|
_cmd_list = cmd_list;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the camera position
|
|
* @details This sets the camera position, which will be used to determine which
|
|
* shadow sources have to get updated
|
|
*
|
|
* @param mat View projection mat
|
|
*/
|
|
inline void InternalLightManager::set_camera_pos(const LPoint3 &pos) {
|
|
_camera_pos = pos;
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the maximum shadow update distance
|
|
* @details This controls the maximum distance until which shadows are updated.
|
|
* If a shadow source is past that distance, it is ignored and no longer recieves
|
|
* updates until it is in range again
|
|
*
|
|
* @param dist Distance in world space units
|
|
*/
|
|
inline void InternalLightManager::set_shadow_update_distance(PN_stdfloat dist) {
|
|
_shadow_update_distance = dist;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the internal used ShadowManager
|
|
* @details This returns a handle to the internally used shadow manager
|
|
* @return Shadow manager
|
|
*/
|
|
inline ShadowManager* InternalLightManager::get_shadow_manager() const {
|
|
return _shadow_manager;
|
|
}
|