xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
abs_scene.hpp
浏览该文件的文档.
1
11#pragma once
12#include <xcal/public.h>
13
14#include <memory>
15#include <type_traits>
16#include <vector>
21
22namespace xcal::scene {
23
32template <typename ObjectPtr = mobject::AbsMObject_ptr>
34 private:
35 using object_t = ObjectPtr::element_type;
36 std::vector<ObjectPtr> mobjects_{};
37 std::vector<std::unique_ptr<camera::AbsCamera>> cameras_{};
38 std::vector<std::unique_ptr<animation::AbsAnimation>>
39 animations_{};
40 std::vector<std::unique_ptr<animation::Timeline>>
41 timelines_{};
42
43 public:
45 AbsScene(const AbsScene&) = delete;
46 AbsScene& operator=(const AbsScene&) = delete;
47
55 template <typename T, class... Args>
56 T* add(Args&&... args) {
57 if constexpr (std::is_base_of_v<animation::Timeline, T>)
58 return (T*)timelines_.emplace_back(std::make_unique<T>(args...))
59 .get();
60 else if constexpr (std::is_base_of_v<animation::AbsAnimation, T>)
61 return (T*)animations_.emplace_back(std::make_unique<T>(args...))
62 .get();
63 else if constexpr (std::is_base_of_v<mobject::AbsMObject, T>)
64 return (T*)mobjects_.emplace_back(std::make_unique<T>(args...))
65 .get();
66 else if constexpr (std::is_base_of_v<camera::AbsCamera, T>)
67 return (T*)cameras_.emplace_back(std::make_unique<T>(args...))
68 .get();
69 else
70 static_assert(false, "unsupported type");
71 }
79 template <typename T>
80 T* add(std::unique_ptr<T>&& obj) {
81 if constexpr (std::is_base_of_v<object_t, T>)
82 return (T*)mobjects_.emplace_back(std::move(obj)).get();
83 else if constexpr (std::is_base_of_v<camera::AbsCamera, T>)
84 return (T*)cameras_.emplace_back(std::move(obj)).get();
85 else if constexpr (std::is_base_of_v<animation::AbsAnimation, T>)
86 return (T*)animations_.emplace_back(std::move(obj)).get();
87 else if constexpr (std::is_base_of_v<animation::Timeline, T>)
88 return (T*)timelines_.emplace_back(std::move(obj)).get();
89 else
90 static_assert(false, "unsupported type");
91 }
99 template <typename T>
100 T* add(T* obj) {
101 if constexpr (std::is_base_of_v<object_t, T>)
102 return (T*)mobjects_.emplace_back(obj).get();
103 else if constexpr (std::is_base_of_v<camera::AbsCamera, T>)
104 return (T*)cameras_.emplace_back(obj).get();
105 else if constexpr (std::is_base_of_v<animation::AbsAnimation, T>)
106 return (T*)animations_.emplace_back(obj).get();
107 else if constexpr (std::is_base_of_v<animation::Timeline, T>)
108 return (T*)timelines_.emplace_back(obj).get();
109 else
110 static_assert(false, "unsupported type");
111 }
119 template <typename T>
120 T* add(T&& obj) {
121 if constexpr (std::is_base_of_v<object_t, T>)
122 return (T*)mobjects_.emplace_back(std::move(obj)).get();
123 else if constexpr (std::is_base_of_v<camera::AbsCamera, T>)
124 return (T*)cameras_.emplace_back(std::move(obj)).get();
125 else if constexpr (std::is_base_of_v<animation::AbsAnimation, T>)
126 return (T*)animations_.emplace_back(std::move(obj)).get();
127 else if constexpr (std::is_base_of_v<animation::Timeline, T>)
128 return (T*)timelines_.emplace_back(std::move(obj)).get();
129 else
130 static_assert(false, "unsupported type");
131 }
132
137 std::vector<ObjectPtr>& mobjects() { return mobjects_; }
138 std::vector<std::unique_ptr<camera::AbsCamera>>& cameras() {
139 return cameras_;
140 }
141 std::vector<std::unique_ptr<animation::Timeline>>& timelines() {
142 return timelines_;
143 }
144 std::vector<std::unique_ptr<animation::AbsAnimation>>& animations() {
145 return animations_;
146 }
147
152 const std::vector<ObjectPtr>& mobjects() const { return mobjects_; }
153 const std::vector<std::unique_ptr<camera::AbsCamera>>& cameras() const {
154 return cameras_;
155 }
156 const std::vector<std::unique_ptr<animation::AbsAnimation>>& animations()
157 const {
158 return animations_;
159 }
160
161 public:
165 virtual ~AbsScene() = default;
166};
167
168} // namespace xcal::scene
抽象动画基类
抽象相机基类
抽象图形对象基类
抽象场景模板类
Definition abs_scene.hpp:33
std::vector< std::unique_ptr< animation::AbsAnimation > > & animations()
std::vector< ObjectPtr > & mobjects()
获取对象列表(可修改)
const std::vector< std::unique_ptr< camera::AbsCamera > > & cameras() const
T * add(T &&obj)
添加对象/相机/动画/时间线
const std::vector< ObjectPtr > & mobjects() const
获取对象列表(只读)
T * add(std::unique_ptr< T > &&obj)
添加对象/相机/动画/时间线
Definition abs_scene.hpp:80
std::vector< std::unique_ptr< animation::Timeline > > & timelines()
T * add(T *obj)
添加对象/相机/动画/时间线
const std::vector< std::unique_ptr< animation::AbsAnimation > > & animations() const
AbsScene & operator=(const AbsScene &)=delete
AbsScene(const AbsScene &)=delete
T * add(Args &&... args)
添加对象/相机/动画/时间线
Definition abs_scene.hpp:56
std::vector< std::unique_ptr< camera::AbsCamera > > & cameras()
virtual ~AbsScene()=default
虚析构函数
#define XCAL_API
Definition public.h:69