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.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/container/find_cache.h> 26 #include <meta/api/event_handler.h> 27 #include <meta/ext/object.h> 28 29 SCENE_BEGIN_NAMESPACE() 30 31 META_REGISTER_CLASS(CameraComponent, "db677290-7776-419d-8883-f1c6387740b1", META_NS::ObjectCategoryBits::NO_CATEGORY) 32 33 class CameraComponent 34 : public META_NS::IntroduceInterfaces<Component, ICamera, IInternalCamera, ICameraRayCast, META_NS::IAttachable> { 35 META_OBJECT(CameraComponent, ClassId::CameraComponent, IntroduceInterfaces) 36 37 public: 38 META_BEGIN_STATIC_DATA() 39 SCENE_STATIC_PROPERTY_DATA(ICamera, float, FoV, "CameraComponent.yFov") 40 SCENE_STATIC_PROPERTY_DATA(ICamera, float, AspectRatio, "CameraComponent.aspect") 41 SCENE_STATIC_PROPERTY_DATA(ICamera, float, NearPlane, "CameraComponent.zNear") 42 SCENE_STATIC_PROPERTY_DATA(ICamera, float, FarPlane, "CameraComponent.zFar") 43 SCENE_STATIC_PROPERTY_DATA(ICamera, float, XMagnification, "CameraComponent.xMag") 44 SCENE_STATIC_PROPERTY_DATA(ICamera, float, YMagnification, "CameraComponent.yMag") 45 SCENE_STATIC_PROPERTY_DATA(ICamera, float, XOffset, "CameraComponent.xOffset") 46 SCENE_STATIC_PROPERTY_DATA(ICamera, float, YOffset, "CameraComponent.yOffset") 47 SCENE_STATIC_PROPERTY_DATA(ICamera, CameraProjection, Projection, "CameraComponent.projection") 48 SCENE_STATIC_PROPERTY_DATA(ICamera, CameraCulling, Culling, "CameraComponent.culling") 49 SCENE_STATIC_PROPERTY_DATA(ICamera, CameraPipeline, RenderingPipeline, "CameraComponent.renderingPipeline") 50 SCENE_STATIC_PROPERTY_DATA(ICamera, uint32_t, SceneFlags, "CameraComponent.sceneFlags") 51 SCENE_STATIC_PROPERTY_DATA(ICamera, uint32_t, PipelineFlags, "CameraComponent.pipelineFlags") 52 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::Vec4, Viewport, "CameraComponent.viewport") 53 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::Vec4, Scissor, "CameraComponent.scissor") 54 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::UVec2, RenderTargetSize, "CameraComponent.renderResolution") 55 SCENE_STATIC_PROPERTY_DATA(ICamera, BASE_NS::Math::Vec4, ClearColor, "CameraComponent.clearColorValue") 56 SCENE_STATIC_PROPERTY_DATA(ICamera, float, ClearDepth, "CameraComponent.clearDepthValue") 57 SCENE_STATIC_PROPERTY_DATA(ICamera, uint64_t, LayerMask, "CameraComponent.layerMask") 58 SCENE_STATIC_PROPERTY_DATA( 59 ICamera, BASE_NS::Math::Mat4X4, CustomProjectionMatrix, "CameraComponent.customProjectionMatrix") 60 61 SCENE_STATIC_DYNINIT_PROPERTY_DATA(ICamera, IPostProcess::Ptr, PostProcess, "CameraComponent.postProcess") 62 SCENE_STATIC_DYNINIT_ARRAY_PROPERTY_DATA( 63 ICamera, ColorFormat, ColorTargetCustomization, "CameraComponent.colorTargetCustomization") 64 META_END_STATIC_DATA() 65 66 META_IMPLEMENT_PROPERTY(float, FoV) 67 META_IMPLEMENT_PROPERTY(float, AspectRatio) 68 META_IMPLEMENT_PROPERTY(float, NearPlane) 69 META_IMPLEMENT_PROPERTY(float, FarPlane) 70 META_IMPLEMENT_PROPERTY(float, XMagnification) 71 META_IMPLEMENT_PROPERTY(float, YMagnification) 72 META_IMPLEMENT_PROPERTY(float, XOffset) 73 META_IMPLEMENT_PROPERTY(float, YOffset) 74 META_IMPLEMENT_PROPERTY(CameraProjection, Projection) 75 META_IMPLEMENT_PROPERTY(CameraCulling, Culling) 76 META_IMPLEMENT_PROPERTY(CameraPipeline, RenderingPipeline) 77 META_IMPLEMENT_PROPERTY(uint32_t, SceneFlags) 78 META_IMPLEMENT_PROPERTY(uint32_t, PipelineFlags) 79 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec4, Viewport) 80 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec4, Scissor) 81 META_IMPLEMENT_PROPERTY(BASE_NS::Math::UVec2, RenderTargetSize) 82 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Vec4, ClearColor) 83 META_IMPLEMENT_PROPERTY(float, ClearDepth) 84 META_IMPLEMENT_PROPERTY(uint64_t, LayerMask) 85 META_IMPLEMENT_PROPERTY(BASE_NS::Math::Mat4X4, CustomProjectionMatrix) 86 87 META_IMPLEMENT_PROPERTY(IPostProcess::Ptr, PostProcess) 88 META_IMPLEMENT_PROPERTY(ColorFormat, ColorTargetCustomization) 89 90 bool InitDynamicProperty(const META_NS::IProperty::Ptr& p, BASE_NS::string_view path) override; 91 92 Future<bool> SetActive(bool active = true) override; 93 Future<bool> SetRenderTarget(const IRenderTarget::Ptr&) override; 94 95 bool IsActive() const override; 96 97 void NotifyRenderTargetChanged() override; 98 99 void SendInputEvent(PointerEvent& event) override; 100 101 public: 102 Future<NodeHits> CastRay(const BASE_NS::Math::Vec2& pos, const RayCastOptions& options) const override; 103 Future<BASE_NS::Math::Vec3> ScreenPositionToWorld(const BASE_NS::Math::Vec3& pos) const override; 104 Future<BASE_NS::Math::Vec3> WorldPositionToScreen(const BASE_NS::Math::Vec3& pos) const override; 105 106 public: 107 bool Build(const META_NS::IMetadata::Ptr&) override; 108 BASE_NS::string GetName() const override; 109 110 bool Attaching(const IAttach::Ptr& target, const IObject::Ptr& dataContext) override; 111 bool Detaching(const IAttach::Ptr& target) override; 112 113 private: 114 META_NS::EventHandler bitmapHandler_; 115 IRenderTarget::Ptr renderTarget_; 116 META_NS::FindCache<IInputReceiver> inputReceivers_; 117 }; 118 119 SCENE_END_NAMESPACE() 120 121 #endif 122