Skip to content

Commit a08f216

Browse files
committed
#158 implement serializable for GUISprite
1 parent ecbbd12 commit a08f216

File tree

6 files changed

+62
-9
lines changed

6 files changed

+62
-9
lines changed

Projects/Editor/Source/Editor/SpaceController/CGUIDesignController.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,34 +117,45 @@ namespace Skylicht
117117

118118
SColor c(255, 255, 255, 255);
119119

120+
std::wstring nameHint;
121+
120122
if (command == L"GUI Element")
121123
{
124+
nameHint = L"GUI";
122125
newNode = parentNode->getCanvas()->createElement(parentNode, r);
123126
}
124127
else if (command == L"GUI Rect")
125128
{
129+
nameHint = L"Rect";
126130
newNode = parentNode->getCanvas()->createRect(parentNode, r, c);
127131
}
128132
else if (command == L"GUI Image")
129133
{
134+
nameHint = L"Img";
130135
newNode = parentNode->getCanvas()->createImage(parentNode, r);
131136
}
132137
else if (command == L"GUI Sprite")
133138
{
139+
nameHint = L"Sprite";
134140
newNode = parentNode->getCanvas()->createSprite(parentNode, r, NULL);
135141
}
136142
else if (command == L"GUI Text")
137143
{
144+
nameHint = L"Txt";
138145
}
139146
else if (command == L"GUI Mask")
140147
{
148+
nameHint = L"Mask";
141149
newNode = parentNode->getCanvas()->createMask(parentNode, r);
142150
}
143151

144152
if (newNode)
145153
{
154+
std::wstring newName = nameHint + L" " + newNode->getNameW();
155+
newNode->setName(newName.c_str());
156+
146157
CGUIHierachyNode* node = parent->addChild();
147-
node->setName(newNode->getNameW().c_str());
158+
node->setName(newName.c_str());
148159
node->setTagData(newNode, CGUIHierachyNode::GUIElement);
149160

150161
setNodeEvent(node);

Projects/Skylicht/Engine/Source/Graphics2D/GUI/CGUISprite.cpp

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ This file is part of the "Skylicht Engine".
2525
#include "pch.h"
2626
#include "CGUISprite.h"
2727
#include "Graphics2D/CGraphics2D.h"
28+
#include "Graphics2D/SpriteFrame/CSpriteManager.h"
2829

2930
namespace Skylicht
3031
{
@@ -123,19 +124,42 @@ namespace Skylicht
123124
CObjectSerializable* CGUISprite::createSerializable()
124125
{
125126
CObjectSerializable* object = CGUIElement::createSerializable();
126-
object->autoRelease(new CFrameSourceProperty(object, "spriteSrc", m_resource.c_str()));
127+
128+
CFrameSourceProperty* frame = new CFrameSourceProperty(object, "spriteSrc", m_frameName.c_str());
129+
frame->setGUID(m_guid.c_str());
130+
frame->setSprite(m_sprite.c_str());
131+
frame->setSpriteGUID(m_spriteId.c_str());
132+
133+
object->autoRelease(frame);
127134
return object;
128135
}
129136

130137
void CGUISprite::loadSerializable(CObjectSerializable* object)
131138
{
132-
std::string src = object->get("spriteSrc", std::string(""));
139+
CFrameSourceProperty* frame = dynamic_cast<CFrameSourceProperty*>(object->getProperty("spriteSrc"));
133140
CGUIElement::loadSerializable(object);
134141

135-
if (src != m_resource)
142+
if (frame != NULL)
136143
{
137-
m_resource = src;
138-
144+
if (m_guid != frame->getGUID())
145+
{
146+
m_guid = frame->getGUID();
147+
m_frameName = frame->get();
148+
m_sprite = frame->getSprite();
149+
m_spriteId = frame->getSpriteGUID();
150+
151+
CSpriteManager* spriteMgr = CSpriteManager::getInstance();
152+
153+
// load by id first
154+
CSpriteFrame* sprite = spriteMgr->getSpriteById(m_spriteId.c_str());
155+
if (!sprite)
156+
sprite = spriteMgr->loadSprite(m_spriteId.c_str());
157+
158+
if (sprite && sprite->getId() == m_spriteId)
159+
{
160+
m_frame = sprite->getFrameById(m_guid.c_str());
161+
}
162+
}
139163
}
140164
}
141165
}

Projects/Skylicht/Engine/Source/Graphics2D/GUI/CGUISprite.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ namespace Skylicht
4141
float m_frameSpeed;
4242
float m_animationTime;
4343

44-
std::string m_resource;
44+
std::string m_guid;
45+
std::string m_frameName;
46+
std::string m_sprite;
47+
std::string m_spriteId;
4548

4649
protected:
4750
CGUISprite(CCanvas* canvas, CGUIElement* parent, SFrame* frame);

Projects/Skylicht/Engine/Source/Graphics2D/SpriteFrame/CSpriteManager.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ This file is part of the "Skylicht Engine".
2828

2929
namespace Skylicht
3030
{
31-
CSpriteManager::CSpriteManager()
31+
CSpriteManager::CSpriteManager() :
32+
m_currentCategory("global")
3233
{
3334

3435
}
@@ -51,6 +52,11 @@ namespace Skylicht
5152
{
5253
char ansiPath[512];
5354

55+
if (category == NULL)
56+
{
57+
category = m_currentCategory.c_str();
58+
}
59+
5460
std::string fixPath = CPath::normalizePath(path);
5561
strcpy(ansiPath, fixPath.c_str());
5662

Projects/Skylicht/Engine/Source/Graphics2D/SpriteFrame/CSpriteManager.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ namespace Skylicht
3838
CSpriteFrame* Sprite;
3939
};
4040

41+
std::string m_currentCategory;
42+
4143
std::map<std::string, CSpriteFrame*> m_idToSprite;
4244
std::map<std::string, CSpriteFrame*> m_pathToSprite;
4345
std::vector<SSpritePackage*> m_spriteList;
@@ -47,12 +49,17 @@ namespace Skylicht
4749

4850
virtual ~CSpriteManager();
4951

50-
CSpriteFrame* loadSprite(const char* path, const char* category = "global");
52+
CSpriteFrame* loadSprite(const char* path, const char* category = NULL);
5153

5254
CSpriteFrame* getSpriteById(const char* id);
5355

5456
void releaseSprite(const char* category);
5557

5658
void releaseSprite(CSpriteFrame* sprite);
59+
60+
inline void setCategory(const char* category)
61+
{
62+
m_currentCategory = category;
63+
}
5764
};
5865
}

Projects/Skylicht/Engine/Source/Serializable/CValuePropertyTemplate.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,9 @@ namespace Skylicht
508508
{
509509
CFrameSourceProperty* value = new CFrameSourceProperty(NULL, Name.c_str());
510510
value->m_value = m_value;
511+
value->m_guid = m_guid;
511512
value->m_sprite = m_sprite;
513+
value->m_spriteId = m_spriteId;
512514
return value;
513515
}
514516

0 commit comments

Comments
 (0)