dl
dl_sprite.h
浏览该文件的文档.
1
14#pragma once
15
16#include "dl_type.h"
18#include "math/dl_coor.h"
19#include "math/dl_math.h"
20#include "math/dl_align.h"
21
22namespace dl
23{
24// 基础绘图优先显示
25constexpr float Z_DEFAULT = 0.0f;
26// 窗口order范围
27constexpr float Z_DEFAULT_WIDNOW_MIN = 0.10f;
28constexpr float Z_DEFAULT_WIDNOW_MAX = 0.50f;
29// ui单独
30constexpr float Z_DEFAULT_UI = 0.55f;
31// ui系统
32constexpr float Z_DEFAULT_PANEL = 0.60f;
33// 用户
34constexpr float Z_DEFAULT_GAME = 0.75f;
35// 背景
36constexpr float Z_DEFAULT_BG = 0.98f;
37// RenderTarget
38constexpr float Z_DEFAULT_RENDER_TARGET = 0.99f;
39
40
41constexpr Float LENGTH_NORMAL = 32.0f;
42constexpr Position POS_ZERO = { 0, 0 };
46
50{
51 std::size_t _tex;
52 std::size_t _rect;
54 _tex{},
55 _rect{}
56 {}
57 SpriteID(std::size_t tex, std::size_t rect) :
58 _tex{ tex },
59 _rect{ rect }
60 {}
61};
62
63inline std::string to_string(const SpriteID& id)
64{
65 return fmt::format("tex: {}, rect: {}", id._tex, id._rect);
66}
67
68class Sprite
69{
70 friend class VK;
71 friend class Factory;
72 friend class PoolList<Sprite>;
73public:
74 enum class Sampler
75 {
76 NORMAL, // 线性采样(写实画风使用)
77 PIXEL, // 点采样(像素风使用)
78 UI, // 线性采样、无mipmap
79 };
80 enum class Blend
81 {
85 };
86
89 void Render();
90
91 float GetOrder() const { return _order; }
92 Quad GetQuad() const { return _quad; }
93 Coor* GetCoor() const { return _coor; }
94 SpriteID GetID() const {return _id;}
102 void SetOrder(float order);
103
104 void SetQuad(const Quad& quad);
109
113 void DtQuadOffset(const Position& offset)
114 {
115 _quad += offset;
116 }
117 void DtQuadRotate(float rotate);
118 void DtQuadScale(const Position& scale);
119 void DtQuadScale(float scale)
120 {
121 DtQuadScale({scale, scale});
122 }
123
128 void SetQuad(QuadParam& param);
129
130 void SetColor(const Color& col);
131 void SetColor(const Color& col, size_t index);
132 void SetCoor(Coor* coor, bool own = false)
133 {
134 _coor = coor;
135 _bOwnCoor = own;
136 }
137
141 {
142 if(!_coor)
143 {
144 SetCoor(Coor::Create(), true);
145 }
146 else
147 {
148 if(_bOwnCoor)
149 {
150 log_warn("已经具有Coor!");
151 return;
152 }
153 SetCoor(Coor::Create(_coor), true);
154 }
155 }
156
161 {
162 if (!_bOwnCoor)
163 return;
164 delete _coor;
165 _coor = nullptr;
166 _bOwnCoor = false;
167 }
168
173 {
174 _sampler = type;
175 }
176
179 void SetBlend(Blend type)
180 {
181 _blend = type;
182 }
183
189 void SetUI(bool ui, bool change_sampler = true);
190
195 void SetClip(Rect* rect)
196 {
197 _scissorRect = rect;
198 }
199
203 void SetBright(float bright)
204 {
205 _bright = bright;
206 }
207
209 void SetUV(size_t index, const UV& uv);
210
211 UV GetUV(size_t index);
212
215
217 bool IsPickup();
218
219
221 Position GetSize() { return Math::GetQuadSize(_quad); }
222
224 Position GetAnchor() { return -_quad.Get((size_t)Align::Corner::LT); }
225
227 Color GetColor(size_t i = 0)
228 {
229 return _col[i];
230 }
231
233 bool IsOwnCoor() { return _bOwnCoor; }
234
237 {
238 if (IsOwnCoor())
239 return _coor;
240 else
241 {//为精灵添加一个独立的Coor
242 Coor* coor = Coor::Create(_coor);
243 SetCoor(coor, true);
244 return coor;
245 }
246 }
247
249
251private:
252 Sprite() :
253 _coor(nullptr),
254 _viewport(nullptr),
255 _scissorRect(nullptr),
256 _sampler{ Sampler::NORMAL },
257 _blend{ Blend::NORMAL },
258 _bright{ 1.0f },
259 _ui(false),
260 _bRenderTarget{ false },
261 _bOwnCoor{ false },
262 _bRoundPixel{ true },
263 _bRender{}
264 {}
265
266 Quad _quad; // 64byte
267 std::array<Color, 4> _col;// 64byte
268 std::array<Position, 4> _uv;// 32byte
269
270 // 默认没有,可以直接指向rootCoor,不拥有资源
271 Coor* _coor;
272 Position4* _viewport;
273 Rect* _scissorRect;
274 Sampler _sampler;
275 Blend _blend;
276 float _bright; // 亮度
277 float _order;// 与z等价
278
279 //id
280 SpriteID _id;// _rect为纹理区域,-1代表失效(手动指定uv的情况)
281
282 bool _bRenderTarget;
283 bool _ui;// 影响isPickup,防止穿透
284 bool _bOwnCoor;// 拥有coor,为真时析构会delete coor
285 bool _bRoundPixel;// 像素取整
286
287 // -------------------------temp 不复制的属性----------------------
288 bool _bRender;// 此帧已绘制
289
290#ifndef NDEBUG
291 std::string _name;
292 bool _bDelete = false;
293#endif // NDEBUG
294
295
296 void _reset_not_copy()
297 {
298 _bRender = false;
299#ifndef NDEBUG
300 _bDelete = false;
301#endif // NDEBUG
302 }
303};
304
306
307
313{
314public:
316
317 gcSprite operator[](size_t index);
318
319 const gcSprite Get(size_t index) const;
320 Coor* GetCoor() { return _coor; }
321 unsigned GetFPS() { return _fps; }
322
324 void SetCoor(Coor* coor, bool own = false);
325 void SetOrder(float order);
326 void SetFPS(unsigned fps) { _fps = fps; }
327
329 void RenderFrame(size_t index);
330
332 void Render(Float dt);
333
334 void Clear() { _allSprite.clear(); }
335
337private:
338 Coor* _coor;
339 bool _bOwnCoor;
340 std::vector<gcSprite> _allSprite;
341 Float _t;
342 unsigned _fps;
343};
344}
2d坐标系
static Coor * Create(Coor *parent=nullptr)
引用计数对象,通过get_gc函数创建
内存池数据
void SetQuad(QuadParam &param)
根据原图设置quad
Position GetAnchor()
返回锚点(一般情况下意义上的锚点)
void DtQuadScale(const Position &scale)
void SetQuad(const Quad &quad)
void DtQuadOffset(const Position &offset)
修改当前quad
void SetOrder(float order)
设置绘制顺序,默认为 Constant::Z_DEFAULT @order 要设置的order,越小越靠近屏幕,范围[0, 1)
Quad GetQuad() const
void SetQuadOrigin()
设置为原始quad大小
Coor * AddCoor()
添加Coor,存在则直接返回
friend class Factory
void DeleteCoor()
删除自己拥有的Coor
Position GetSize()
返回大小(一般情况下意义上的大小)
void SetSampler(Sampler type)
设置采样器,对于像素图来说应该设置为 SamplerType::PIXEL
friend class VK
void SetUI(bool ui, bool change_sampler=true)
设置后为ui精灵,会屏蔽order大于自己的ui精灵的pickup响应
void RenderDebug()
void SetColor(const Color &col, size_t index)
void CreateCoor()
创建自己拥有的Coor,并指向父Coor
void Render()
绘制
void SetClip(Rect *rect)
设置裁剪(世界坐标系)
void SetBlend(Blend type)
设置混合模式
bool IsOwnCoor()
是否拥有coor
UV GetUV(size_t index)
Coor * GetCoor() const
void SetColor(const Color &col)
void DtQuadRotate(float rotate)
void SetCoor(Coor *coor, bool own=false)
bool IsPickup()
是否被鼠标选中
float GetOrder() const
void SetBright(float bright)
设置亮度
Color GetColor(size_t i=0)
返回颜色
SpriteID GetID() const
bool IsColorOne()
是否非透明精灵(四个顶点颜色均为非透明)
void SetUV(size_t index, const UV &uv)
手动设置uv后,纹理区域id失效
void DtQuadScale(float scale)
void SetCoor(Coor *coor, bool own=false)
void SetOrder(float order)
void RenderFrame(size_t index)
传入下标
const gcSprite Get(size_t index) const
gcSprite operator[](size_t index)
void Render(Float dt)
传入帧时间
void SetFPS(unsigned fps)
void PushBack(gcSprite spr)
方向和对齐定义
2d坐标系
#define log_warn(...)
数学相关的通用算法
基于引用计数的内存池
通用类型
constexpr T GetQuadSize(const Array< T, 4 > &quad)
返回 Quad 的大小
Position2 Position
float Float
constexpr float Z_DEFAULT_UI
constexpr Float LENGTH_NORMAL
Array< float, 2 > UV
constexpr Position POS_NORMAL
std::string to_string(T v)
to_string包装
constexpr float Z_DEFAULT
GC< Sprite > gcSprite
Array< Float, 4 > Position4
constexpr Position SIZE_DEFAULT_SPRITE
Array< float, 4 > Color
Point4 Rect
constexpr Quad QUAD_DEFAULT_SPRITE
constexpr float Z_DEFAULT_GAME
constexpr float Z_DEFAULT_WIDNOW_MAX
constexpr float Z_DEFAULT_RENDER_TARGET
constexpr Quad createQuad(const Position &p0, const Position &p1, const Position &p2, const Position &p3)
创建一个Quad
constexpr Position POS_ZERO
Array< Position, 4 > Quad
constexpr float Z_DEFAULT_PANEL
constexpr float Z_DEFAULT_BG
constexpr float Z_DEFAULT_WIDNOW_MIN
四边形参数设置
std::size_t _tex
纹理下标 或 RenderTarget下标(由_bRenderTarget控制)
SpriteID(std::size_t tex, std::size_t rect)
std::size_t _rect
区域下标