1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef SCENE_SRC_COMPONENT_CAMERA_COMPONENT_H 17 #define SCENE_SRC_COMPONENT_CAMERA_COMPONENT_H 18 19 #include <scene/ext/component_fwd.h> 20 #include <scene/ext/intf_internal_camera.h> 21 #include <scene/interface/intf_camera.h> 22 #include <scene/interface/intf_raycast.h> 23 #include <shared_mutex> 24 25 #include <meta/api/event_handler.h> 26 #include <meta/ext/object.h> 27 28 SCENE_BEGIN_NAMESPACE() 29 30 META_REGISTER_CLASS(CameraComponent, "db677290-7776-419d-8883-f1c6387740b1", META_NS::ObjectCategoryBits::NO_CATEGORY) 31 32 class CameraComponent : public META_NS::IntroduceInterfaces<ComponentFwd, ICamera, IInternalCamera, ICameraRayCast> { 33 META_OBJECT(CameraComponent, ClassId::CameraComponent, IntroduceInterfaces) 34 35 public: 36 META_BEGIN_STATIC_DATA() 37 SCENE_STATIC_PROPERTY_DATA(ICamera, float, FoV, "CameraComponent.yFov") 38 SCENE_STATIC_PROPERTY_DATA(ICamera, float, AspectRatio, "CameraComponent.aspect") 39 SCENE_STATIC_PROPERTY_DATA(ICamera, float, NearPlane, "CameraComponent.zNear") 40 SCENE_STATIC_PROPERTY_DATA(ICamera, float, FarPlane, "CameraComponent.zFar") 41 SCENE_STATIC_PROPERTY_DATA(ICamera, float, XMagnification, "CameraComponent.xMag") 42 SCENE_STATIC_PROPERTY_DATA(ICamera, float, YMagnification, "CameraComponent.yMag") 43 SCENE_STATIC_PROPERTY_DATA(ICamera, float, XOffset, "CameraComponent.xOffset") 44 SCENE_STATIC_PROPERTY_DATA(ICamera, float, YOffset, "CameraComponent.yOffset") 45 SCENE_STATIC_PROPERTY_DATA(ICamera, CameraProjection, Projection, "CameraComponent.projection") 46 SCENE_STATIC_PROPERTY_DATA(ICamera, CameraCulling, Culling, "CameraComponent.culling") 47 SCENE_STATIC_PROPERTY_DATA(ICamera, CameraPipeline, RenderingPipeline, "CameraComponent.renderingPipeline") 48 SCENE_STATIC_PROPERTY_DATA(ICamera, uint32_t, SceneFlags, "CameraComponent.sceneFlags") 49 SCENE_STATIC_PROPERTY_DATA(ICamera, uint32_t, PipelineFlags, "CameraComponent.pipelineFlags") 50 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::Vec4, Viewport, "CameraComponent.viewport") 51 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::Vec4, Scissor, "CameraComponent.scissor") 52 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::UVec2, RenderTargetSize, "CameraComponent.renderResolution") 53 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Color, ClearColor, "CameraComponent.clearColorValue") 54 SCENE_STATIC_PROPERTY_DATA(ICamera, float, ClearDepth, "CameraComponent.clearDepthValue") 55 SCENE_STATIC_PROPERTY_DATA(ICamera, uint64_t, LayerMask, "CameraComponent.layerMask") 56 SCENE_STATIC_PROPERTY_DATA( 57 ICamera, BASE_NS::Math::Mat4X4, CustomProjectionMatrix, "CameraComponent.customProjectionMatrix") 58 59 SCENE_STATIC_DYNINIT_PROPERTY_DATA(ICamera, IPostProcess::Ptr, PostProcess, "CameraComponent.postProcess") 60 SCENE_STATIC_DYNINIT_ARRAY_PROPERTY_DATA( 61 ICamera, ColorFormat, ColorTargetCustomization, "CameraComponent.colorTargetCustomization") 62 META_END_STATIC_DATA() 63 64 META_IMPLEMENT_PROPERTY(float, FoV) 65 META_IMPLEMENT_PROPERTY(float, AspectRatio) 66 META_IMPLEMENT_PROPERTY(float, NearPlane) 67 META_IMPLEMENT_PROPERTY(float, FarPlane) 68 META_IMPLEMENT_PROPERTY(float, XMagnification) 69 META_IMPLEMENT_PROPERTY(float, YMagnification) 70 META_IMPLEMENT_PROPERTY(float, XOffset) 71 META_IMPLEMENT_PROPERTY(float, YOffset) 72 META_IMPLEMENT_PROPERTY(CameraProjection, Projection) 73 META_IMPLEMENT_PROPERTY(CameraCulling, Culling) 74 META_IMPLEMENT_PROPERTY(CameraPipeline, RenderingPipeline) 75 META_IMPLEMENT_PROPERTY(uint32_t, SceneFlags) 76 META_IMPLEMENT_PROPERTY(uint32_t, PipelineFlags) 77 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec4, Viewport) 78 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec4, Scissor) 79 META_IMPLEMENT_PROPERTY(BASE_NS::Math::UVec2, RenderTargetSize) 80 META_IMPLEMENT_PROPERTY(BASE_NS::Color, ClearColor) 81 META_IMPLEMENT_PROPERTY(float, ClearDepth) 82 META_IMPLEMENT_PROPERTY(uint64_t, LayerMask) 83 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Mat4X4, CustomProjectionMatrix) 84 85 META_IMPLEMENT_PROPERTY(IPostProcess::Ptr, PostProcess) 86 META_IMPLEMENT_PROPERTY(ColorFormat, ColorTargetCustomization) 87 88 bool InitDynamicProperty(const META_NS::IProperty::Ptr& p, BASE_NS::string_view path) override; 89 90 Future<bool> SetActive(bool active = true) override; 91 Future<bool> SetRenderTarget(const IRenderTarget::Ptr&) override; 92 93 bool IsActive() const override; 94 95 void NotifyRenderTargetChanged() override; 96 public: 97 Future<NodeHits> CastRay(const BASE_NS::Math::Vec2& pos, const RayCastOptions& options) const override; 98 Future<BASE_NS::Math::Vec3> ScreenPositionToWorld(const BASE_NS::Math::Vec3& pos) const override; 99 Future<BASE_NS::Math::Vec3> WorldPositionToScreen(const BASE_NS::Math::Vec3& pos) const override; 100 public: 101 bool Build(const META_NS::IMetadata::Ptr&) override; 102 BASE_NS::string GetName() const override; 103 104 private: 105 META_NS::EventHandler bitmapHandler_; 106 IRenderTarget::Ptr renderTarget_; 107 }; 108 109 SCENE_END_NAMESPACE() 110 111 #endif