Scene.h
Go to the documentation of this file.
1 /****
2  * Scene.h
3  *
4  * Copyright 2021 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the Sming-Graphics Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  * @author: May 2021 - mikee47 <mike@sillyhouse.net>
19  *
20  ****/
21 
22 #pragma once
23 
24 #include "Object.h"
25 
26 namespace Graphics
27 {
31 class SceneObject : public Object
32 {
33 public:
34  using Callback = Delegate<void(SceneObject* scene)>;
35 
37  {
38  }
39 
40  SceneObject(Size size, const String& name = nullptr) : Object(), size(size), name(name)
41  {
42  }
43 
44  SceneObject(RenderTarget& target, const String& name = nullptr) : SceneObject(target.getSize(), name)
45  {
46  }
47 
48  Kind kind() const override
49  {
50  return Kind::Scene;
51  }
52 
53  void write(MetaWriter& meta) const override
54  {
55  meta.write("name", name);
56  meta.writeArray("objects", "Object", objects);
57  meta.writeArray("assets", "Asset", assets);
58  }
59 
60  Renderer* createRenderer(const Location& location) const override;
61 
70  template <typename T> T* addObject(T* obj)
71  {
72  objects.add(obj);
73  return obj;
74  }
75 
76  template <typename T> typename std::enable_if<std::is_base_of<Asset, T>::value, T*>::type addAsset(T* asset)
77  {
78  assets.add(asset);
79  return asset;
80  }
81 
83  {
84  auto asset = new ObjectAsset(object);
85  assets.add(asset);
86  return asset;
87  }
88 
89  Size getSize() const
90  {
91  return size;
92  }
93 
97  void reset(Size size)
98  {
99  objects.clear();
100  this->size = size;
101  }
102 
106  void clear(const Brush& brush = Color::Black)
107  {
108  objects.clear();
109  fillRect(brush, size);
110  }
111 
112  template <typename... ParamTypes> FilledRectObject* fillRect(ParamTypes... params)
113  {
114  return addObject(new FilledRectObject(params...));
115  }
116 
117  template <typename... ParamTypes> RectObject* drawRect(ParamTypes... params)
118  {
119  return addObject(new RectObject(params...));
120  }
121 
122  RectObject* drawRoundRect(int x0, int y0, int w, int h, int radius, Color color)
123  {
124  return drawRect(color, Rect(x0, y0, w, h), radius);
125  }
126 
127  FilledRectObject* fillRoundRect(int x0, int y0, int w, int h, int radius, Color color)
128  {
129  return fillRect(color, Rect(x0, y0, w, h), radius);
130  }
131 
132  template <typename... ParamTypes> LineObject* drawLine(ParamTypes... params)
133  {
134  return addObject(new LineObject(params...));
135  }
136 
137  template <typename... ParamTypes> PolylineObject* drawTriangle(const Pen& pen, Point pt1, Point pt2, Point pt3)
138  {
139  return drawPolyline(pen, pt1, pt2, pt3, pt1);
140  }
141 
142  PolylineObject* drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, Color color)
143  {
144  return drawTriangle(color, Point(x0, y0), Point(x1, y1), Point(x2, y2));
145  }
146 
147  template <typename... ParamTypes> PolylineObject* drawPolyline(ParamTypes... params)
148  {
149  return addObject(new PolylineObject(params...));
150  }
151 
152  template <typename... ParamTypes> CircleObject* drawCircle(ParamTypes... params)
153  {
154  return addObject(new CircleObject(params...));
155  }
156 
157  template <typename... ParamTypes> FilledCircleObject* fillCircle(ParamTypes... params)
158  {
159  return addObject(new FilledCircleObject(params...));
160  }
161 
162  template <typename... ParamTypes> EllipseObject* drawEllipse(ParamTypes... params)
163  {
164  return addObject(new EllipseObject(params...));
165  }
166 
167  template <typename... ParamTypes> FilledEllipseObject* fillEllipse(ParamTypes... params)
168  {
169  return addObject(new FilledEllipseObject(params...));
170  }
171 
172  template <typename... ParamTypes> ArcObject* drawArc(ParamTypes... params)
173  {
174  return addObject(new ArcObject(params...));
175  }
176 
177  template <typename... ParamTypes> FilledArcObject* fillArc(ParamTypes... params)
178  {
179  return addObject(new FilledArcObject(params...));
180  }
181 
182  template <typename... ParamTypes>
183  ReferenceObject* drawImage(const ImageObject& image, Point pos, ParamTypes... params)
184  {
185  return drawObject(image, Rect{pos, image.getSize()}, params...);
186  }
187 
188  template <typename... ParamTypes> ReferenceObject* drawObject(const Object& object, ParamTypes... params)
189  {
190  return addObject(new ReferenceObject(object, params...));
191  }
192 
193  SurfaceObject* copySurface(Surface& surface, const Rect& dest, Point source)
194  {
195  return addObject(new SurfaceObject(surface, dest, source));
196  }
197 
203  CopyObject* copy(const Rect& source, Point dest)
204  {
205  return addObject(new CopyObject(source, dest));
206  }
207 
217  ScrollObject* scroll(const Rect& area, int16_t cx, int16_t cy, bool wrapx = false, bool wrapy = false,
218  Color fill = Color::None)
219  {
220  return addObject(new ScrollObject(area, {cx, cy}, wrapx, wrapy, fill));
221  }
222 
223  ScrollObject* scroll(const Rect& area, int16_t cx, int16_t cy, Color fill)
224  {
225  return scroll(area, cx, cy, false, false, fill);
226  }
227 
231  AssetList assets; // Not drawn directly, but may be referred to
232 };
233 
234 } // namespace Graphics
Class to manage a NUL-terminated C-style string When storing persistent strings in RAM the regular St...
Definition: CString.h:27
Definition: Delegate.h:20
An arc outline.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:508
Definition: Asset.h:753
The source of colour for drawing.
Definition: Asset.h:253
A circle outline.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:370
Describes a copy operation within the same surface.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:1122
An ellipse outline.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:454
A filled arc.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:535
A filled circle.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:411
A filled ellipse.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:481
A filled rectangle.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:227
Virtual base class for an image.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:562
Size getSize() const
Definition: Libraries/Graphics/src/include/Graphics/Object.h:575
A drawn line.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:258
Writes object content in readable format for debugging.
Definition: Meta.h:48
void writeArray(const String &name, const String &type, const T *values, unsigned count)
Definition: Meta.h:135
std::enable_if< std::is_base_of< Meta, T >::value, void >::type write(const String &name, const T &value)
Definition: Meta.h:55
Definition: Asset.h:743
A drawable object inherits from this virtual base class.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:97
Kind
Definition: Libraries/Graphics/src/include/Graphics/Object.h:102
Definition: Asset.h:403
A sequence of lines.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:300
A rectangular outline.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:197
Reference to another object.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:151
Interface for objects which support writing via surfaces.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:739
Virtual base class to manage rendering of various types of information to a surface.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:66
A Scene containing multiple objects.
Definition: Scene.h:32
PolylineObject * drawPolyline(ParamTypes... params)
Definition: Scene.h:147
ScrollObject * scroll(const Rect &area, int16_t cx, int16_t cy, bool wrapx=false, bool wrapy=false, Color fill=Color::None)
Scroll display memory.
Definition: Scene.h:217
void clear(const Brush &brush=Color::Black)
Clear the scene and fill with a chosen colour.
Definition: Scene.h:106
FilledArcObject * fillArc(ParamTypes... params)
Definition: Scene.h:177
ObjectAsset * addAsset(Object *object)
Definition: Scene.h:82
PolylineObject * drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, Color color)
Definition: Scene.h:142
ReferenceObject * drawObject(const Object &object, ParamTypes... params)
Definition: Scene.h:188
FilledRectObject * fillRect(ParamTypes... params)
Definition: Scene.h:112
RectObject * drawRect(ParamTypes... params)
Definition: Scene.h:117
Size getSize() const
Definition: Scene.h:89
ArcObject * drawArc(ParamTypes... params)
Definition: Scene.h:172
RectObject * drawRoundRect(int x0, int y0, int w, int h, int radius, Color color)
Definition: Scene.h:122
Kind kind() const override
Definition: Scene.h:48
AssetList assets
Definition: Scene.h:231
FilledCircleObject * fillCircle(ParamTypes... params)
Definition: Scene.h:157
SceneObject(Size size, const String &name=nullptr)
Definition: Scene.h:40
Size size
Definition: Scene.h:228
SurfaceObject * copySurface(Surface &surface, const Rect &dest, Point source)
Definition: Scene.h:193
CircleObject * drawCircle(ParamTypes... params)
Definition: Scene.h:152
LineObject * drawLine(ParamTypes... params)
Definition: Scene.h:132
CopyObject * copy(const Rect &source, Point dest)
Copy region of display to another.
Definition: Scene.h:203
FilledEllipseObject * fillEllipse(ParamTypes... params)
Definition: Scene.h:167
ReferenceObject * drawImage(const ImageObject &image, Point pos, ParamTypes... params)
Definition: Scene.h:183
OwnedList objects
Definition: Scene.h:230
SceneObject(RenderTarget &target, const String &name=nullptr)
Definition: Scene.h:44
void reset(Size size)
Reset the scene with a new size.
Definition: Scene.h:97
EllipseObject * drawEllipse(ParamTypes... params)
Definition: Scene.h:162
ScrollObject * scroll(const Rect &area, int16_t cx, int16_t cy, Color fill)
Definition: Scene.h:223
SceneObject()
Definition: Scene.h:36
void write(MetaWriter &meta) const override
Definition: Scene.h:53
PolylineObject * drawTriangle(const Pen &pen, Point pt1, Point pt2, Point pt3)
Definition: Scene.h:137
std::enable_if< std::is_base_of< Asset, T >::value, T * >::type addAsset(T *asset)
Definition: Scene.h:76
Renderer * createRenderer(const Location &location) const override
Create a software renderer for this object.
T * addObject(T *obj)
Add a new object to the scene.
Definition: Scene.h:70
FilledRectObject * fillRoundRect(int x0, int y0, int w, int h, int radius, Color color)
Definition: Scene.h:127
CString name
Definition: Scene.h:229
Describes a scrolling operation.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:1146
Describes a target surface and corresponding source location.
Definition: Libraries/Graphics/src/include/Graphics/Object.h:1095
Interface for a drawing surface.
Definition: Surface.h:42
bool add(ObjectType *object)
Definition: LinkedObjectList.h:134
Class template for singly-linked list of objects.
Definition: LinkedObjectList.h:175
void clear()
Definition: LinkedObjectList.h:194
The String class.
Definition: WString.h:137
Definition: Virtual.h:31
TPoint< int16_t > Point
Definition: Libraries/Graphics/src/include/Graphics/Types.h:280
Color
Standard colour definitions.
Definition: Colors.h:227
Identifies position within bounding rectangle.
Definition: Libraries/Graphics/src/include/Graphics/Types.h:683
Location and size of rectangular area (x, y, w, h)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:287
Size of rectangular area (width x height)
Definition: Libraries/Graphics/src/include/Graphics/Types.h:105