1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "BsPrerequisites.h"
6#include "GUI/BsGUISkin.h"
7#include "Utility/BsModule.h"
8#include "Math/BsVector2I.h"
9#include "BsApplication.h"
10
11#include "ThirdParty/json.hpp"
12
13namespace bs
14{
15 /** @addtogroup Resources-Engine
16 * @{
17 */
18
19 /** Types of builtin meshes that are always available. */
20 enum class BuiltinMesh
21 {
22 Box, Sphere, Cone, Cylinder, Quad, Disc
23 };
24
25 /** Types of builtin textures that are always available. */
26 enum class BuiltinTexture
27 {
28 White, Black, Normal
29 };
30
31 /** Types of builtin shaders that are always available. */
32 enum class BS_SCRIPT_EXPORT() BuiltinShader
33 {
34 Custom,
35 /** Physically based shader used for opaque 3D geometry. */
36 Standard,
37 /** Physically based shader used for transparent 3D geometry. */
38 Transparent,
39 /** Special shader used for rendering particles without any lighting, with support for transparency. */
40 ParticlesUnlit,
41 /**
42 * Special shader used for rendering particles with lighting using the forward rendering pipeline (supports
43 * transparency).
44 */
45 ParticlesLit,
46 /**
47 * Special shader used for rendering particles with lighting using the deferred rendering pipeline (no support
48 * for transparency).
49 */
50 ParticlesLitOpaque,
51 /** Special shader used for rendering decals that project onto other geometry. */
52 Decal
53 };
54
55 /** Holds references to built-in resources used by the core engine. */
56 class BS_EXPORT BuiltinResources : public bs::Module<BuiltinResources>
57 {
58 public:
59 BuiltinResources();
60 ~BuiltinResources();
61
62 /** Returns the default skin used by engine GUI elements. */
63 const HGUISkin& getGUISkin() const { return mSkin; }
64
65 /** Returns an empty skin used to be used when no other is available. */
66 const HGUISkin& getEmptyGUISkin() const { return mEmptySkin; }
67
68 /** Returns a small entirely white texture. */
69 const HSpriteTexture& getWhiteSpriteTexture() const { return mWhiteSpriteTexture; }
70
71 /** Returns a 2x2 sprite texture that can be used when no other is available. */
72 const HSpriteTexture& getDummySpriteTexture() const { return mDummySpriteTexture; }
73
74 /** Returns a dummy 2x2 texture that may be used when no other is available. Don't modify the returned texture. */
75 const HTexture& getDummyTexture() const { return mDummyTexture; }
76
77 /** Returns image data for an arrow cursor, along with its hotspot. */
78 const PixelData& getCursorArrow(Vector2I& hotSpot);
79
80 /** Returns image data for an arrow with dragged object cursor, along with its hotspot. */
81 const PixelData& getCursorArrowDrag(Vector2I& hotSpot);
82
83 /** Returns image data for a wait cursor, along with its hotspot. */
84 const PixelData& getCursorWait(Vector2I& hotSpot);
85
86 /** Returns image data for an "I" beam cursor, along with its hotspot. */
87 const PixelData& getCursorIBeam(Vector2I& hotSpot);
88
89 /** Returns image data for a NESW resize cursor, along with its hotspot. */
90 const PixelData& getCursorSizeNESW(Vector2I& hotSpot);
91
92 /** Returns image data for a NS resize cursor, along with its hotspot. */
93 const PixelData& getCursorSizeNS(Vector2I& hotSpot);
94
95 /** Returns image data for a NWSE resize cursor, along with its hotspot. */
96 const PixelData& getCursorSizeNWSE(Vector2I& hotSpot);
97
98 /** Returns image data for a WE resize cursor, along with its hotspot. */
99 const PixelData& getCursorSizeWE(Vector2I& hotSpot);
100
101 /** Returns image data for a deny cursor, along with its hotspot. */
102 const PixelData& getCursorDeny(Vector2I& hotSpot);
103
104 /** Returns image data for a move left-right cursor, along with its hotspot. */
105 const PixelData& getCursorMoveLeftRight(Vector2I& hotSpot);
106
107 /** Returns the default application icon. */
108 const PixelData& getFrameworkIcon();
109
110 /** Returns one of the builtin shader types. */
111 HShader getBuiltinShader(BuiltinShader type) const;
112
113 /** Creates a material used for textual sprite rendering (for example text in GUI). */
114 HMaterial createSpriteTextMaterial() const;
115
116 /** Creates a material used for image sprite rendering (for example images in GUI). */
117 HMaterial createSpriteImageMaterial() const;
118
119 /** Creates a material used for antialiased line rendering (for example curve rendering in GUI). */
120 HMaterial createSpriteLineMaterial() const;
121
122 /** Retrieves one of the builtin meshes. */
123 HMesh getMesh(BuiltinMesh mesh) const;
124
125 /**
126 * Loads a shader at the specified path.
127 *
128 * @param[in] path Path relative to the default shader folder with no file extension.
129 */
130 HShader getShader(const Path& path) const;
131
132 /** Returns the default font used by the engine. */
133 HFont getDefaultFont() const { return mFont; }
134
135 /** Retrieves one of the builtin textures. */
136 static HTexture getTexture(BuiltinTexture type);
137
138 /** Returns absolute path to the builtin shader folder where raw shader files are located. */
139 static Path getRawShaderFolder();
140
141 /** Returns absolute path to the builtin shader include folder. */
142 static Path getShaderIncludeFolder();
143
144 /** Returns absolute path to the builtin icons folder. */
145 static Path getIconFolder();
146
147#if BS_IS_BANSHEE3D || defined BS_IS_ASSET_TOOL
148 /** Returns absolute path to the editor builtin shader include folder. */
149 static Path getEditorShaderIncludeFolder();
150
151#endif
152
153 static constexpr const char* IconTextureName = "bsfIcon.png";
154 static constexpr const char* MultiLineLabelStyle = "MultiLineLabel";
155
156 static constexpr const char* SHADER_FOLDER = "Shaders/";
157 static constexpr const char* CURSOR_FOLDER = "Cursors/";
158 static constexpr const char* ICON_FOLDER = "Icons/";
159 static constexpr const char* ICON3D_FOLDER = "Icons3D/";
160 static constexpr const char* SKIN_FOLDER = "Skin/";
161 static constexpr const char* ANIMATED_SPRITES_FOLDER = "AnimatedSprites/";
162 static constexpr const char* SHADER_INCLUDE_FOLDER = "Shaders/Includes/";
163 static constexpr const char* MESH_FOLDER = "Meshes/";
164 static constexpr const char* TEXTURE_FOLDER = "Textures/";
165 static constexpr const char* SPRITE_FOLDER = "Sprites/";
166
167 static constexpr const char* MESH_SPHERE_FILE = u8"Sphere.asset";
168 static constexpr const char* MESH_BOX_FILE = u8"Box.asset";
169 static constexpr const char* MESH_CONE_FILE = u8"Cone.asset";
170 static constexpr const char* MESH_CYLINDER_FILE = u8"Cylinder.asset";
171 static constexpr const char* MESH_QUAD_FILE = u8"Quad.asset";
172 static constexpr const char* MESH_DISC_FILE = u8"Disc.asset";
173
174 static constexpr const char* TEXTURE_WHITE_FILE = u8"White.asset";
175 static constexpr const char* TEXTURE_BLACK_FILE = u8"Black.asset";
176 static constexpr const char* TEXTURE_NORMAL_FILE = u8"Normal.asset";
177
178 static constexpr const char* DEFAULT_FONT_NAME = u8"arial.ttf";
179 static constexpr const UINT32 DEFAULT_FONT_SIZE = 8;
180
181 static constexpr const char* GUI_SKIN_FILE = u8"GUISkin";
182 private:
183 /** Loads a GUI skin texture with the specified filename. */
184 HSpriteTexture getSkinTexture(const String& name) const;
185
186 /** Loads a cursor texture with the specified filename. */
187 HTexture getCursorTexture(const String& name) const;
188
189 HGUISkin mEmptySkin;
190 HGUISkin mSkin;
191 HFont mFont;
192
193 SPtr<PixelData> mCursorArrow;
194 SPtr<PixelData> mCursorArrowDrag;
195 SPtr<PixelData> mCursorArrowLeftRight;
196 SPtr<PixelData> mCursorIBeam;
197 SPtr<PixelData> mCursorDeny;
198 SPtr<PixelData> mCursorWait;
199 SPtr<PixelData> mCursorSizeNESW;
200 SPtr<PixelData> mCursorSizeNS;
201 SPtr<PixelData> mCursorSizeNWSE;
202 SPtr<PixelData> mCursorSizeWE;
203 SPtr<PixelData> mFrameworkIcon;
204
205 HSpriteTexture mWhiteSpriteTexture;
206 HSpriteTexture mDummySpriteTexture;
207
208 HTexture mDummyTexture;
209
210 HShader mShaderSpriteText;
211 HShader mShaderSpriteImage;
212 HShader mShaderSpriteLine;
213 HShader mShaderDiffuse;
214 HShader mShaderTransparent;
215 HShader mShaderParticlesUnlit;
216 HShader mShaderParticlesLit;
217 HShader mShaderParticlesLitOpaque;
218 HShader mShaderDecal;
219
220 SPtr<ResourceManifest> mResourceManifest;
221
222 Path mBuiltinRawDataFolder;
223 Path mBuiltinDataFolder;
224 Path mEngineSkinSpritesFolder;
225 Path mEngineShaderFolder;
226 Path mEngineMeshFolder;
227 Path mEngineCursorFolder;
228
229 Path ResourceManifestPath;
230
231 static const String WhiteTex;
232
233 static const String CursorArrowTex;
234 static const String CursorArrowDragTex;
235 static const String CursorArrowLeftRightTex;
236 static const String CursorIBeamTex;
237 static const String CursorDenyTex;
238 static const String CursorWaitTex;
239 static const String CursorSizeNESWTex;
240 static const String CursorSizeNSTex;
241 static const String CursorSizeNWSETex;
242 static const String CursorSizeWETex;
243
244 static const Vector2I CursorArrowHotspot;
245 static const Vector2I CursorArrowDragHotspot;
246 static const Vector2I CursorArrowLeftRightHotspot;
247 static const Vector2I CursorIBeamHotspot;
248 static const Vector2I CursorDenyHotspot;
249 static const Vector2I CursorWaitHotspot;
250 static const Vector2I CursorSizeNESWHotspot;
251 static const Vector2I CursorSizeNSHotspot;
252 static const Vector2I CursorSizeNWSEHotspot;
253 static const Vector2I CursorSizeWEHotspot;
254
255 static const String ShaderSpriteTextFile;
256 static const String ShaderSpriteImageFile;
257 static const String ShaderSpriteLineFile;
258 };
259
260 /** Provides easy access to BuiltinResources. */
261 BS_EXPORT BuiltinResources& gBuiltinResources();
262
263 /** @} */
264}
265