You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
7.4 KiB
212 lines
7.4 KiB
/****************************************************************************
|
|
Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
|
|
|
|
http://www.cocos.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.
|
|
****************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "base/Macros.h"
|
|
#include "base/Ptr.h"
|
|
#include "base/RefCounted.h"
|
|
#include "core/Root.h"
|
|
#include "core/assets/RenderTexture.h"
|
|
#include "core/assets/TextureCube.h"
|
|
#include "renderer/pipeline/Define.h"
|
|
#include "scene/Camera.h"
|
|
namespace cc {
|
|
namespace scene {
|
|
class ReflectionProbe final {
|
|
public:
|
|
explicit ReflectionProbe(int32_t id);
|
|
~ReflectionProbe() = default;
|
|
void initialize(Node* probeNode, Node* cameraNode);
|
|
enum class ProbeType {
|
|
CUBE = 0,
|
|
PLANAR = 1,
|
|
};
|
|
/**
|
|
* @en Set probe type,cube or planar.
|
|
* @zh 设置探针类型,cube或者planar
|
|
*/
|
|
inline void setProbeType(ProbeType type) {
|
|
_probeType = type;
|
|
}
|
|
inline ProbeType getProbeType() const { return _probeType; }
|
|
inline int32_t getProbeId() const { return _probeId; }
|
|
void setResolution(int32_t resolution);
|
|
inline int32_t getResolution() const { return _resolution; }
|
|
/**
|
|
* @en Clearing flags of the camera, specifies which part of the framebuffer will be actually cleared every frame.
|
|
* @zh 相机的缓冲清除标志位,指定帧缓冲的哪部分要每帧清除。
|
|
*/
|
|
inline void setClearFlag(gfx::ClearFlagBit value) {
|
|
_clearFlag = value;
|
|
_camera->setClearFlag(_clearFlag);
|
|
}
|
|
inline gfx::ClearFlagBit getClearFlag() const { return _clearFlag; }
|
|
|
|
/**
|
|
* @en Clearing color of the camera.
|
|
* @zh 相机的颜色缓冲默认值。
|
|
*/
|
|
inline void setBackgroundColor(gfx::Color& val) {
|
|
_backgroundColor = val;
|
|
_camera->setClearColor(val);
|
|
}
|
|
inline const gfx::Color& getBackgroundColor() const { return _backgroundColor; }
|
|
|
|
/**
|
|
* @en Visibility mask, declaring a set of node layers that will be visible to this camera.
|
|
* @zh 可见性掩码,声明在当前相机中可见的节点层级集合。
|
|
*/
|
|
inline void setVisibility(int32_t val) { _visibility = val; }
|
|
inline int32_t getVisibility() const { return _visibility; }
|
|
|
|
/**
|
|
* @en Gets or sets the size of the bouding box, in local space.
|
|
* @zh 获取或设置包围盒的大小。
|
|
*/
|
|
inline void setBoudingSize(Vec3& value) {
|
|
_size = value;
|
|
const Vec3 pos = _node->getWorldPosition();
|
|
geometry::AABB::set(_boundingBox, pos.x, pos.y, pos.z, _size.x, _size.y, _size.z);
|
|
}
|
|
inline const Vec3& getBoudingSize() const { return _size; }
|
|
/**
|
|
* @en The node of the probe.
|
|
* @zh probe绑定的节点
|
|
*/
|
|
inline Node* getNode() { return _node; }
|
|
inline const Camera* getCamera() const { return _camera; }
|
|
inline bool needRender() const { return _needRender; }
|
|
inline void setNeedRender(bool b) { _needRender = b; }
|
|
inline const geometry::AABB* getBoundingBox() const { return _boundingBox; }
|
|
|
|
inline void setCameraNode(Node* val) { _cameraNode = val; }
|
|
inline Node* getCameraNode() const { return _cameraNode; }
|
|
|
|
inline void setPreviewSphere(Node* val) { _previewSphere = val; }
|
|
inline const Node* getPreviewSphere() const { return _previewSphere; }
|
|
|
|
inline void setPreviewPlane(Node* val) { _previewPlane = val; }
|
|
inline const Node* getPreviewPlane() const { return _previewPlane; }
|
|
|
|
inline void setCubeMap(cc::TextureCube* cubeMap) { _cubemap = cubeMap; }
|
|
inline const cc::TextureCube* getCubeMap() const { return _cubemap; }
|
|
|
|
inline RenderTexture* getRealtimePlanarTexture() const { return _realtimePlanarTexture; }
|
|
void updateBoundingBox();
|
|
void syncCameraParams(const Camera* camera);
|
|
void transformReflectionCamera(const Camera* sourceCamera);
|
|
void renderPlanarReflection(const Camera* camera);
|
|
void switchProbeType(int32_t type, const Camera* sourceCamera);
|
|
static Vec3 reflect(const Vec3& point, const Vec3& normal, float offset);
|
|
|
|
void updatePlanarTexture(const scene::RenderScene* scene);
|
|
|
|
void destroy();
|
|
void enable();
|
|
void disable();
|
|
|
|
inline bool validate() const { return _cubemap != nullptr; }
|
|
|
|
void initBakedTextures();
|
|
void captureCubemap();
|
|
|
|
inline const ccstd::vector<IntrusivePtr<cc::RenderTexture>>& getBakedCubeTextures() const { return _bakedCubeTextures; }
|
|
void resetCameraParams();
|
|
void updateCameraDir(int32_t faceIdx);
|
|
Vec2 renderArea() const;
|
|
void packBackgroundColor();
|
|
bool isRGBE() const;
|
|
|
|
private:
|
|
ccstd::vector<IntrusivePtr<cc::RenderTexture>> _bakedCubeTextures;
|
|
IntrusivePtr<cc::RenderTexture> _realtimePlanarTexture{nullptr};
|
|
|
|
int32_t _resolution = 256;
|
|
gfx::ClearFlagBit _clearFlag = gfx::ClearFlagBit::NONE;
|
|
gfx::Color _backgroundColor{1.0, 1.0, 1.0, 1.0};
|
|
int32_t _visibility = 0;
|
|
ProbeType _probeType = ProbeType::CUBE;
|
|
IntrusivePtr<TextureCube> _cubemap{nullptr};
|
|
Vec3 _size;
|
|
/**
|
|
* @en Objects inside bouding box.
|
|
* @zh 包围盒范围内的物体
|
|
*/
|
|
ccstd::vector<Model*> _renderObjects;
|
|
|
|
/**
|
|
* @en Render cubemap's camera
|
|
* @zh 渲染cubemap的相机
|
|
*/
|
|
IntrusivePtr<scene::Camera> _camera{nullptr};
|
|
|
|
/**
|
|
* @en Unique id of probe.
|
|
* @zh probe的唯一id
|
|
*/
|
|
int32_t _probeId = 0;
|
|
|
|
bool _needRender = false;
|
|
|
|
IntrusivePtr<Node> _node;
|
|
|
|
IntrusivePtr<Node> _cameraNode;
|
|
IntrusivePtr<Node> _previewSphere;
|
|
IntrusivePtr<Node> _previewPlane;
|
|
|
|
/**
|
|
* @en The AABB bounding box and probe only render the objects inside the bounding box.
|
|
* @zh AABB包围盒,probe只渲染包围盒内的物体
|
|
*/
|
|
IntrusivePtr<geometry::AABB> _boundingBox{nullptr};
|
|
|
|
/**
|
|
* @en The position of the camera in world space.
|
|
* @zh 世界空间相机的位置
|
|
*/
|
|
Vec3 _cameraWorldPos;
|
|
|
|
/**
|
|
* @en The rotation of the camera in world space.
|
|
* @zh 世界空间相机的旋转
|
|
*/
|
|
Quaternion _cameraWorldRotation;
|
|
|
|
/**
|
|
* @en The forward direction vertor of the camera in world space.
|
|
* @zh 世界空间相机朝前的方向向量
|
|
*/
|
|
Vec3 _forward;
|
|
/**
|
|
* @en The up direction vertor of the camera in world space.
|
|
* @zh 世界空间相机朝上的方向向量
|
|
*/
|
|
Vec3 _up;
|
|
|
|
CC_DISALLOW_COPY_MOVE_ASSIGN(ReflectionProbe);
|
|
};
|
|
|
|
} // namespace scene
|
|
} // namespace cc
|
|
|