2019-11-23 20:27:39 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2013 cocos2d-x.org
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
http://www.cocos2d-x.org
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include "editor-support/cocostudio/FlatBuffersSerialize.h"
|
|
|
|
|
|
|
|
#include "base/ObjectFactory.h"
|
|
|
|
#include "ui/CocosGUI.h"
|
|
|
|
#include "platform/CCFileUtils.h"
|
|
|
|
#include "editor-support/cocostudio/CocoStudio.h"
|
|
|
|
#include "editor-support/cocostudio/CSLanguageDataBinary_generated.h"
|
|
|
|
#include "editor-support/cocostudio/CSParseBinary_generated.h"
|
|
|
|
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/NodeReaderProtocol.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/NodeReaderDefine.h"
|
|
|
|
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/NodeReader/NodeReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/SingleNodeReader/SingleNodeReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/SpriteReader/SpriteReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ParticleReader/ParticleReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/GameMapReader/GameMapReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ComAudioReader/ComAudioReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ProjectNodeReader/ProjectNodeReader.h"
|
|
|
|
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ButtonReader/ButtonReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/CheckBoxReader/CheckBoxReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ImageViewReader/ImageViewReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/TextBMFontReader/TextBMFontReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/TextReader/TextReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/TextAtlasReader/TextAtlasReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/LoadingBarReader/LoadingBarReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/SliderReader/SliderReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/LayoutReader/LayoutReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ScrollViewReader/ScrollViewReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/PageViewReader/PageViewReader.h"
|
|
|
|
#include "editor-support/cocostudio/WidgetReader/ListViewReader/ListViewReader.h"
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
#include "editor-support/cocostudio/WidgetReader/TextFieldReader/TextFieldExReader.h"
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
#include "flatbuffers/flatbuffers.h"
|
|
|
|
#include "flatbuffers/util.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
USING_NS_CC;
|
|
|
|
using namespace cocos2d::ui;
|
|
|
|
using namespace cocostudio;
|
|
|
|
using namespace cocostudio::timeline;
|
|
|
|
using namespace flatbuffers;
|
|
|
|
|
|
|
|
namespace cocostudio {
|
|
|
|
|
|
|
|
static const char* Property_VisibleForFrame = "VisibleForFrame";
|
2019-11-24 23:15:56 +08:00
|
|
|
static const char* Property_Position = "Position";
|
|
|
|
static const char* Property_Scale = "Scale";
|
|
|
|
static const char* Property_RotationSkew = "RotationSkew";
|
|
|
|
static const char* Property_CColor = "CColor";
|
|
|
|
static const char* Property_FileData = "FileData";
|
|
|
|
static const char* Property_FrameEvent = "FrameEvent";
|
|
|
|
static const char* Property_Alpha = "Alpha";
|
|
|
|
static const char* Property_AnchorPoint = "AnchorPoint";
|
|
|
|
static const char* Property_ZOrder = "ZOrder";
|
|
|
|
static const char* Property_ActionValue = "ActionValue";
|
|
|
|
static const char* Property_BlendValue = "BlendFunc";
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
static FlatBuffersSerialize* _instanceFlatBuffersSerialize = nullptr;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
FlatBuffersSerialize::FlatBuffersSerialize()
|
2019-11-24 23:15:56 +08:00
|
|
|
: _isSimulator(false)
|
|
|
|
, _builder(nullptr)
|
|
|
|
, _csparsebinary(nullptr)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(NodeReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(SingleNodeReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(SpriteReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(ParticleReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(GameMapReader);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
CREATE_CLASS_NODE_READER_INFO(ButtonReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(CheckBoxReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(ImageViewReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(TextBMFontReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(TextReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(TextFieldReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(TextAtlasReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(LoadingBarReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(SliderReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(LayoutReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(ScrollViewReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(PageViewReader);
|
|
|
|
CREATE_CLASS_NODE_READER_INFO(ListViewReader);
|
2019-11-24 23:15:56 +08:00
|
|
|
CREATE_CLASS_NODE_READER_INFO(TextFieldExReader);
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
FlatBuffersSerialize::~FlatBuffersSerialize()
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
FlatBuffersSerialize* FlatBuffersSerialize::getInstance()
|
|
|
|
{
|
|
|
|
if (!_instanceFlatBuffersSerialize)
|
|
|
|
{
|
|
|
|
_instanceFlatBuffersSerialize = new (std::nothrow) FlatBuffersSerialize();
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return _instanceFlatBuffersSerialize;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
void FlatBuffersSerialize::purge()
|
|
|
|
{
|
|
|
|
CC_SAFE_DELETE(_instanceFlatBuffersSerialize);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBuffersSerialize::destroyInstance()
|
|
|
|
{
|
|
|
|
CC_SAFE_DELETE(_instanceFlatBuffersSerialize);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void FlatBuffersSerialize::deleteFlatBufferBuilder()
|
|
|
|
{
|
|
|
|
if (_builder != nullptr)
|
|
|
|
{
|
|
|
|
_builder->Clear();
|
|
|
|
CC_SAFE_DELETE(_builder);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string FlatBuffersSerialize::serializeFlatBuffersWithXMLFile(const std::string& xmlFileName, const std::string& flatbuffersFileName)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string inFullpath = FileUtils::getInstance()->fullPathForFilename(xmlFileName).c_str();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// xml read
|
|
|
|
if (!FileUtils::getInstance()->isFileExist(inFullpath))
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
return ".csd file doesn't exists!";
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
std::string xmlBuffer = FileUtils::getInstance()->getStringFromFile(inFullpath);
|
|
|
|
return serializeFlatBuffersWithXMLBuffer(xmlBuffer, flatbuffersFileName);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string FlatBuffersSerialize::serializeFlatBuffersWithXMLBuffer(std::string& xmlBuffer,
|
|
|
|
const std::string& flatbuffersFileName)
|
|
|
|
{
|
2019-11-23 20:27:39 +08:00
|
|
|
// xml parse
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_document document;
|
|
|
|
if (!xmlBuffer.empty())
|
|
|
|
document.load_buffer_inplace(&xmlBuffer.front(), xmlBuffer.length());
|
|
|
|
if (document)
|
|
|
|
return serializeFlatBuffersWithOpaque(&document, flatbuffersFileName);
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string FlatBuffersSerialize::serializeFlatBuffersWithOpaque(void* opaque,
|
|
|
|
const std::string& flatbuffersFileName)
|
|
|
|
{
|
|
|
|
auto thiz = FlatBuffersSerialize::getInstance();
|
|
|
|
|
|
|
|
// xml parse
|
|
|
|
pugi::xml_document& document = *reinterpret_cast<pugi::xml_document*>(opaque);
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node rootElement = document.document_element();// Root
|
|
|
|
// CCLOG("rootElement name = %s", rootelement.name());
|
|
|
|
|
|
|
|
pugi::xml_node element = rootElement.first_child();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
bool serializeEnabled = false;
|
|
|
|
std::string rootType = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (element)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG("entity name = %s", element.name());
|
|
|
|
if (strcmp("PropertyGroup", element.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = element.first_attribute();
|
|
|
|
while (attribute && strcmp("Version", attribute.name()) != 0)
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attribute)
|
2019-11-24 23:15:56 +08:00
|
|
|
thiz->_csdVersion = attribute.value();
|
|
|
|
|
|
|
|
thiz->_csdVersion = "10.0.3000.0";
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
if (strcmp("Content", element.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = element.first_attribute();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
//
|
|
|
|
if (!attribute)
|
|
|
|
{
|
|
|
|
serializeEnabled = true;
|
|
|
|
rootType = "NodeObjectData";
|
|
|
|
}
|
|
|
|
//
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
//
|
|
|
|
// while (attribute)
|
|
|
|
// {
|
2019-11-24 23:15:56 +08:00
|
|
|
// std::string name = attribute.name();
|
|
|
|
// std::string value = attribute.value();
|
2019-11-23 20:27:39 +08:00
|
|
|
// CCLOG("attribute name = %s, value = %s", name, value);
|
|
|
|
// if (name == "")
|
|
|
|
// {
|
|
|
|
// serializeEnabled = true;
|
|
|
|
// rootType = (strcmp("", value) == 0) ? "Node" : value;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// if (serializeEnabled)
|
|
|
|
// {
|
|
|
|
// break;
|
|
|
|
// }
|
|
|
|
//
|
2019-11-24 23:15:56 +08:00
|
|
|
// attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
// }
|
|
|
|
//
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (serializeEnabled)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto child = element.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (child)
|
|
|
|
{
|
|
|
|
element = child;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
element = element.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (serializeEnabled)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
thiz->_builder = new (std::nothrow) FlatBufferBuilder();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Offset<NodeTree> nodeTree;
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<NodeAction> action;
|
2019-11-23 20:27:39 +08:00
|
|
|
std::vector<Offset<flatbuffers::AnimationInfo>> animationInfos;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto child = element.first_child();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = child.name();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Animation") // action
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node animation = child;
|
|
|
|
action = thiz->createNodeAction(animation);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (name == "ObjectData") // nodeTree
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node objectData = child;
|
2019-11-23 20:27:39 +08:00
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
auto nameElem = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (nameElem)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
if (0 == strcmp("ctype", nameElem.name()))
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
rootType = nameElem.value();
|
2019-11-23 20:27:39 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
2019-11-24 23:15:56 +08:00
|
|
|
nameElem = nameElem.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
if (rootType == "GameNodeObjectData" || rootType == "GameLayerObjectData") // for adaptate old version
|
|
|
|
rootType = "NodeObjectData";
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
nodeTree = thiz->createNodeTree(objectData, rootType);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (name == "AnimationList") // animation list
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node animationinfoElement = child.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (animationinfoElement)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto animationinfo = thiz->createAnimationInfo(animationinfoElement);
|
2019-11-23 20:27:39 +08:00
|
|
|
animationInfos.push_back(animationinfo);
|
2019-11-24 23:15:56 +08:00
|
|
|
animationinfoElement = animationinfoElement.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto csparsebinary = CreateCSParseBinary(*thiz->_builder,
|
|
|
|
thiz->_builder->CreateString(thiz->_csdVersion),
|
|
|
|
thiz->_builder->CreateVector(thiz->_textures),
|
|
|
|
thiz->_builder->CreateVector(thiz->_texturePngs),
|
|
|
|
nodeTree,
|
|
|
|
action,
|
|
|
|
thiz->_builder->CreateVector(animationInfos));
|
|
|
|
thiz->_builder->Finish(csparsebinary);
|
|
|
|
|
|
|
|
thiz->_textures.clear();
|
|
|
|
thiz->_texturePngs.clear();
|
|
|
|
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string outFullPath = FileUtils::getInstance()->fullPathForFilename(flatbuffersFileName);
|
|
|
|
size_t pos = outFullPath.find_last_of('.');
|
|
|
|
std::string convert = outFullPath.substr(0, pos).append(".csb");
|
|
|
|
auto save = flatbuffers::SaveFile(convert.c_str(),
|
2019-11-24 23:15:56 +08:00
|
|
|
reinterpret_cast<const char *>(thiz->_builder->GetBufferPointer()),
|
|
|
|
thiz->_builder->GetSize(),
|
|
|
|
true);
|
2019-11-23 20:27:39 +08:00
|
|
|
if (!save)
|
|
|
|
{
|
|
|
|
return "couldn't save files!";
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
thiz->deleteFlatBufferBuilder();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
// NodeTree
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<NodeTree> FlatBuffersSerialize::createNodeTree(pugi::xml_node objectData,
|
|
|
|
std::string classType)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
std::string classname = classType.substr(0, classType.find("ObjectData"));
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG("classname = %s", classname.c_str());
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string name = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Offset<Options> options;
|
|
|
|
std::vector<Offset<NodeTree>> children;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (classname == "ProjectNode")
|
|
|
|
{
|
|
|
|
auto reader = ProjectNodeReader::getInstance();
|
2019-11-24 23:15:56 +08:00
|
|
|
auto tempOptions = reader->createOptionsWithFlatBuffers(objectData, _builder);
|
|
|
|
|
|
|
|
options = CreateOptions(*_builder, *(Offset<WidgetOptions>*)(&tempOptions));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (classname == "SimpleAudio")
|
|
|
|
{
|
|
|
|
auto reader = ComAudioReader::getInstance();
|
2019-11-24 23:15:56 +08:00
|
|
|
auto tempOptions = reader->createOptionsWithFlatBuffers(objectData, _builder);
|
|
|
|
options = CreateOptions(*_builder, *(Offset<WidgetOptions>*)(&tempOptions));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::string readername = getGUIClassName(classname);
|
|
|
|
readername.append("Reader");
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
NodeReaderProtocol* reader = dynamic_cast<NodeReaderProtocol*>(ObjectFactory::getInstance()->createObject(readername));
|
|
|
|
if (reader != nullptr)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto tempOptions = reader->createOptionsWithFlatBuffers(objectData, _builder);
|
|
|
|
options = CreateOptions(*_builder, *(Offset<WidgetOptions>*)(&tempOptions));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// children
|
|
|
|
bool containChildrenElement = false;
|
2019-11-24 23:15:56 +08:00
|
|
|
auto child = objectData.first_child();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG("child name = %s", child.name());
|
|
|
|
|
|
|
|
if (strcmp("Children", child.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
containChildrenElement = true;
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (containChildrenElement)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
child = child.first_child();
|
|
|
|
// CCLOG("element name = %s", child.name());
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = child.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
bool bHasType = false;
|
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attriname == "ctype")
|
|
|
|
{
|
|
|
|
children.push_back(createNodeTree(child, value));
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
bHasType = true;
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
if (!bHasType)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
children.push_back(createNodeTree(child, "NodeObjectData"));
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string customClassName = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attriname == "CustomClassName")
|
|
|
|
{
|
|
|
|
customClassName = value;
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateNodeTree(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
_builder->CreateString(classname),
|
|
|
|
_builder->CreateVector(children),
|
|
|
|
options,
|
|
|
|
_builder->CreateString(customClassName));
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
int FlatBuffersSerialize::getResourceType(std::string key)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
if (key == "Normal" || key == "Default")
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
if (_isSimulator)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
if (key == "MarkedSubImage")
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string FlatBuffersSerialize::getGUIClassName(const std::string &name)
|
|
|
|
{
|
|
|
|
std::string convertedClassName = name;
|
|
|
|
if (name == "Panel")
|
|
|
|
{
|
|
|
|
convertedClassName = "Layout";
|
|
|
|
}
|
|
|
|
else if (name == "TextArea")
|
|
|
|
{
|
|
|
|
convertedClassName = "Text";
|
|
|
|
}
|
|
|
|
else if (name == "TextButton")
|
|
|
|
{
|
|
|
|
convertedClassName = "Button";
|
|
|
|
}
|
|
|
|
else if (name == "Label")
|
|
|
|
{
|
|
|
|
convertedClassName = "Text";
|
|
|
|
}
|
|
|
|
else if (name == "LabelAtlas")
|
|
|
|
{
|
|
|
|
convertedClassName = "TextAtlas";
|
|
|
|
}
|
|
|
|
else if (name == "LabelBMFont")
|
|
|
|
{
|
|
|
|
convertedClassName = "TextBMFont";
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return convertedClassName;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string FlatBuffersSerialize::getWidgetReaderClassName(Widget* widget)
|
|
|
|
{
|
|
|
|
std::string readerName;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// 1st., custom widget parse properties of parent widget with parent widget reader
|
|
|
|
if (dynamic_cast<Button*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "ButtonReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<CheckBox*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "CheckBoxReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<ImageView*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "ImageViewReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<TextAtlas*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "TextAtlasReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<TextBMFont*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "TextBMFontReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<Text*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "TextReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<LoadingBar*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "LoadingBarReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<Slider*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "SliderReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<TextField*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "TextFieldReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<ListView*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "ListViewReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<PageView*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "PageViewReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<ScrollView*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "ScrollViewReader";
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
else if (dynamic_cast<Layout*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "LayoutReader";
|
|
|
|
}
|
|
|
|
else if (dynamic_cast<Widget*>(widget))
|
|
|
|
{
|
|
|
|
readerName = "WidgetReader";
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return readerName;
|
|
|
|
}
|
|
|
|
|
|
|
|
// NodeAction
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<NodeAction> FlatBuffersSerialize::createNodeAction(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int duration = 0;
|
|
|
|
float speed = 0.0f;
|
|
|
|
std::string currentAnimationName = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
// CCLOG("animation name = %s", objectData->Name());
|
|
|
|
|
|
|
|
// ActionTimeline
|
|
|
|
auto attribute = objectData.first_attribute();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// attributes
|
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Duration")
|
|
|
|
{
|
|
|
|
duration = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Speed")
|
|
|
|
{
|
|
|
|
speed = atof(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "ActivedAnimationName")
|
|
|
|
{
|
|
|
|
currentAnimationName = value.c_str();
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// all Timeline
|
|
|
|
std::vector<Offset<TimeLine>> timelines;
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node timelineElement = objectData.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (timelineElement)
|
|
|
|
{
|
|
|
|
auto timeLine = createTimeLine(timelineElement);
|
|
|
|
timelines.push_back(timeLine);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
timelineElement = timelineElement.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateNodeAction(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
duration,
|
|
|
|
speed,
|
|
|
|
_builder->CreateVector(timelines),
|
|
|
|
_builder->CreateString(currentAnimationName));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<flatbuffers::AnimationInfo> FlatBuffersSerialize::createAnimationInfo(pugi::xml_node objectData)
|
|
|
|
{
|
|
|
|
std::string infoName = "";
|
|
|
|
int startIndex = 0;
|
|
|
|
int endIndex = 0;
|
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
|
|
|
while (attribute)
|
|
|
|
{
|
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string attrivalue = attribute.value();
|
|
|
|
if (attriname == "Name")
|
|
|
|
{
|
|
|
|
infoName = attrivalue;
|
|
|
|
}
|
|
|
|
else if (attriname == "StartIndex")
|
|
|
|
{
|
|
|
|
startIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (attriname == "EndIndex")
|
|
|
|
{
|
|
|
|
endIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
attribute = attribute.next_attribute();
|
|
|
|
}
|
|
|
|
return CreateAnimationInfo(*_builder, _builder->CreateString(infoName), startIndex, endIndex);
|
|
|
|
}
|
|
|
|
|
|
|
|
Offset<TimeLine> FlatBuffersSerialize::createTimeLine(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int actionTag = 0;
|
|
|
|
std::string property = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// TimelineData attributes
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "ActionTag")
|
|
|
|
{
|
|
|
|
actionTag = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Property")
|
|
|
|
{
|
|
|
|
property = value;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// all Frame
|
|
|
|
std::vector<Offset<flatbuffers::Frame>> frames;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
pugi::xml_node frameElement = objectData.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (frameElement)
|
|
|
|
{
|
|
|
|
Offset<flatbuffers::Frame> frame;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (property == Property_VisibleForFrame)
|
|
|
|
{
|
|
|
|
auto boolFrame = createBoolFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
0, // TextureFrame
|
|
|
|
0, // EventFrame
|
|
|
|
0, // IntFrame
|
|
|
|
boolFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_Position)
|
|
|
|
{
|
|
|
|
auto pointFrame = createPointFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
pointFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_Scale)
|
|
|
|
{
|
|
|
|
auto scaleFrame = createScaleFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
scaleFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_RotationSkew)
|
|
|
|
{
|
|
|
|
auto scaleFrame = createScaleFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
scaleFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_CColor)
|
|
|
|
{
|
|
|
|
auto colorFrame = createColorFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
colorFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_FileData)
|
|
|
|
{
|
|
|
|
auto textureFrame = createTextureFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
textureFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_FrameEvent)
|
|
|
|
{
|
|
|
|
auto eventFrame = createEventFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
0, // TextureFrame
|
|
|
|
eventFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_Alpha)
|
|
|
|
{
|
|
|
|
auto intFrame = createIntFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
0, // TextureFrame
|
|
|
|
0, // EventFrame
|
|
|
|
intFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_AnchorPoint)
|
|
|
|
{
|
|
|
|
auto scaleFrame = createScaleFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
scaleFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_ZOrder)
|
|
|
|
{
|
|
|
|
auto intFrame = createIntFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
0, // TextureFrame
|
|
|
|
0, // EventFrame
|
|
|
|
intFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_ActionValue)
|
|
|
|
{
|
|
|
|
auto innerActionFrame = createInnerActionFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
0, // TextureFrame
|
|
|
|
0, // EventFrame
|
|
|
|
0, // IntFrame
|
|
|
|
0, // BoolFrame
|
|
|
|
innerActionFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (property == Property_BlendValue)
|
|
|
|
{
|
|
|
|
auto blendFrame = createBlendFrame(frameElement);
|
|
|
|
frame = CreateFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
0, // PointFrame
|
|
|
|
0, // ScaleFrame
|
|
|
|
0, // ColorFrame
|
|
|
|
0, // TextureFrame
|
|
|
|
0, // EventFrame
|
|
|
|
0, // IntFrame
|
|
|
|
0, // BoolFrame
|
|
|
|
0, //InnerActionFrame
|
|
|
|
blendFrame);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
frames.push_back(frame);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
frameElement = frameElement.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateTimeLine(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
_builder->CreateString(property),
|
|
|
|
actionTag,
|
|
|
|
_builder->CreateVector(frames));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
Offset<flatbuffers::PointFrame> FlatBuffersSerialize::createPointFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
Vec2 position;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "X")
|
|
|
|
{
|
|
|
|
position.x = atof(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Y")
|
|
|
|
{
|
|
|
|
position.y = atof(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (value == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FVec2 f_position(position.x, position.y);
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreatePointFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
&f_position,
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<flatbuffers::ScaleFrame> FlatBuffersSerialize::createScaleFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
Vec2 scale;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "X")
|
|
|
|
{
|
|
|
|
scale.x = atof(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Y")
|
|
|
|
{
|
|
|
|
scale.y = atof(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (value == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Scale f_scale(scale.x, scale.y);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateScaleFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
&f_scale,
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<flatbuffers::ColorFrame> FlatBuffersSerialize::createColorFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
Color3B color;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (value == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// color
|
2019-11-24 23:15:56 +08:00
|
|
|
auto child = objectData.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
attribute = child.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "R")
|
|
|
|
{
|
|
|
|
color.r = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "G")
|
|
|
|
{
|
|
|
|
color.g = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "B")
|
|
|
|
{
|
|
|
|
color.b = atoi(value.c_str());
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Color f_color(255, color.r, color.g, color.b);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateColorFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
&f_color,
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<flatbuffers::TextureFrame> FlatBuffersSerialize::createTextureFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string path = "";
|
|
|
|
std::string plistFile = "";
|
|
|
|
int resourceType = 0;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string texture = "";
|
|
|
|
std::string texturePng = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attriname == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (attriname == "Tween")
|
|
|
|
{
|
|
|
|
tween = (value == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto child = objectData.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
attribute = child.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attriname == "Path")
|
|
|
|
{
|
|
|
|
path = value;
|
|
|
|
}
|
|
|
|
else if (attriname == "Type")
|
|
|
|
{
|
|
|
|
resourceType = getResourceType(value);
|
|
|
|
}
|
|
|
|
else if (attriname == "Plist")
|
|
|
|
{
|
|
|
|
plistFile = value;
|
|
|
|
texture = value;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (resourceType == 1)
|
|
|
|
{
|
|
|
|
_textures.push_back(_builder->CreateString(texture));
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateTextureFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
CreateResourceData(*_builder,
|
|
|
|
_builder->CreateString(path),
|
|
|
|
_builder->CreateString(plistFile),
|
|
|
|
resourceType),
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<flatbuffers::EventFrame> FlatBuffersSerialize::createEventFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
std::string value = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string attrivalue = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Value") // to be gonna modify
|
|
|
|
{
|
|
|
|
value = attrivalue;
|
|
|
|
}
|
|
|
|
else if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (attrivalue == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateEventFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
_builder->CreateString(value),
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<flatbuffers::IntFrame> FlatBuffersSerialize::createIntFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
int value = 0;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string attrivalue = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Value") // to be gonna modify
|
|
|
|
{
|
|
|
|
value = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (attrivalue == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateIntFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
value,
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
Offset<flatbuffers::BoolFrame> FlatBuffersSerialize::createBoolFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
bool value = true;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string attrivalue = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Value")
|
|
|
|
{
|
|
|
|
value = (attrivalue == "True") ? true : false;
|
|
|
|
}
|
|
|
|
else if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (attrivalue == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateBoolFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
value,
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
Offset<flatbuffers::InnerActionFrame> FlatBuffersSerialize::createInnerActionFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
|
|
|
int innerActionType = 0;
|
|
|
|
std::string currentAniamtionName = "";
|
|
|
|
int singleFrameIndex = 0;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string attrivalue = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "InnerActionType")
|
|
|
|
{
|
|
|
|
if (attrivalue == "LoopAction")
|
|
|
|
{
|
|
|
|
innerActionType = 0;
|
|
|
|
}
|
|
|
|
else if (attrivalue == "NoLoopAction")
|
|
|
|
{
|
|
|
|
innerActionType = 1;
|
|
|
|
}
|
|
|
|
else if (attrivalue == "SingleFrame")
|
|
|
|
{
|
|
|
|
innerActionType = 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (name == "CurrentAniamtionName")
|
|
|
|
{
|
|
|
|
currentAniamtionName = attrivalue;
|
|
|
|
}
|
|
|
|
else if (name == "SingleFrameIndex")
|
|
|
|
{
|
|
|
|
singleFrameIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(attrivalue.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (attrivalue == "True") ? true : false;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateInnerActionFrame(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
innerActionType,
|
|
|
|
_builder->CreateString(currentAniamtionName),
|
|
|
|
singleFrameIndex,
|
|
|
|
createEasingData(objectData.first_child()));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
flatbuffers::Offset<flatbuffers::BlendFrame> FlatBuffersSerialize::createBlendFrame(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
int frameIndex = 0;
|
|
|
|
bool tween = true;
|
2019-11-24 23:15:56 +08:00
|
|
|
int32_t src = GL_ONE, dst = GL_ONE_MINUS_SRC_ALPHA;
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string name = "";
|
|
|
|
std::string value = "";
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
name = attribute.name();
|
|
|
|
value = attribute.value();
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
if (name == "FrameIndex")
|
|
|
|
{
|
|
|
|
frameIndex = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Tween")
|
|
|
|
{
|
|
|
|
tween = (value == "True") ? true : false;
|
|
|
|
}
|
|
|
|
else if (name == "Src")
|
|
|
|
{
|
|
|
|
src = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Dst")
|
|
|
|
{
|
|
|
|
dst = atoi(value.c_str());
|
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
flatbuffers::Offset<flatbuffers::EasingData> easingData;
|
|
|
|
flatbuffers::BlendFunc blendFunc(src, dst);
|
|
|
|
return CreateBlendFrame(*_builder,
|
|
|
|
frameIndex,
|
|
|
|
tween,
|
|
|
|
&blendFunc,
|
|
|
|
easingData);
|
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
flatbuffers::Offset<flatbuffers::EasingData> FlatBuffersSerialize::createEasingData(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
if (!objectData)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
int type = -1;
|
2019-11-24 23:15:56 +08:00
|
|
|
std::vector<flatbuffers::FVec2> points;
|
|
|
|
|
|
|
|
auto attribute = objectData.first_attribute();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Type")
|
|
|
|
{
|
|
|
|
type = atoi(value.c_str());
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
pugi::xml_node Points = objectData.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (Points)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node PointF = Points.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (PointF)
|
|
|
|
{
|
|
|
|
Vec2 pointF;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = PointF.first_attribute();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "X")
|
|
|
|
{
|
|
|
|
pointF.x = atof(value.c_str());
|
|
|
|
}
|
|
|
|
else if (name == "Y")
|
|
|
|
{
|
|
|
|
pointF.y = atof(value.c_str());
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
flatbuffers::FVec2 f_PointF(pointF.x, pointF.y);
|
2019-11-23 20:27:39 +08:00
|
|
|
points.push_back(f_PointF);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
PointF = PointF.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateEasingData(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
type,
|
|
|
|
_builder->CreateVectorOfStructs(points));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
/* create flat buffers with XML */
|
|
|
|
FlatBufferBuilder* FlatBuffersSerialize::createFlatBuffersWithXMLFileForSimulator(const std::string &xmlFileName)
|
2019-11-24 23:15:56 +08:00
|
|
|
{
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string inFullpath = FileUtils::getInstance()->fullPathForFilename(xmlFileName);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// xml read
|
|
|
|
if (!FileUtils::getInstance()->isFileExist(inFullpath))
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG(".csd file does not exist.");
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string content = FileUtils::getInstance()->getStringFromFile(inFullpath);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// xml parse
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_document document;
|
|
|
|
if(!content.empty())
|
|
|
|
document.load_buffer_inplace(&content.front(), content.length());
|
|
|
|
|
|
|
|
pugi::xml_node rootElement = document.document_element();// Root
|
|
|
|
// CCLOG("rootElement name = %s", rootelement.name());
|
|
|
|
|
|
|
|
pugi::xml_node element = rootElement.first_child();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
bool serializeEnabled = false;
|
|
|
|
std::string rootType = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (element)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG("entity name = %s", element.name());
|
|
|
|
if (strcmp("PropertyGroup", element.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = element.first_attribute();
|
|
|
|
while (attribute && strcmp("Version", attribute.name()) != 0)
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attribute)
|
2019-11-24 23:15:56 +08:00
|
|
|
_csdVersion = attribute.value();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
if (strcmp("Content", element.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = element.first_attribute();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
//
|
|
|
|
if (!attribute)
|
|
|
|
{
|
|
|
|
serializeEnabled = true;
|
|
|
|
rootType = "NodeObjectData";
|
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (serializeEnabled)
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto child = element.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (child)
|
|
|
|
{
|
|
|
|
element = child;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
element = element.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (serializeEnabled)
|
|
|
|
{
|
|
|
|
_builder = new (std::nothrow) FlatBufferBuilder();
|
|
|
|
|
|
|
|
Offset<NodeTree> nodeTree;
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<NodeAction> action;
|
2019-11-23 20:27:39 +08:00
|
|
|
std::vector<Offset<flatbuffers::AnimationInfo> > animationInfos;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
auto child = element.first_child();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = child.name();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Animation") // action
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node animation = child;
|
|
|
|
action = createNodeAction(animation);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (name == "ObjectData") // nodeTree
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node objectData = child;
|
|
|
|
auto nameElem = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (nameElem)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
if (0 == strcmp("ctype", nameElem.name()))
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
rootType = nameElem.value();
|
2019-11-23 20:27:39 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
2019-11-24 23:15:56 +08:00
|
|
|
nameElem = nameElem.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
if (rootType == "GameNodeObjectData" || rootType == "GameLayerObjectData") // for adaptate old version
|
|
|
|
rootType = "NodeObjectData";
|
|
|
|
nodeTree = createNodeTreeForSimulator(objectData, rootType);
|
|
|
|
}
|
|
|
|
else if (name == "AnimationList") // animation list
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node animationinfoElement = child.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (animationinfoElement)
|
|
|
|
{
|
|
|
|
auto animationinfo = createAnimationInfo(animationinfoElement);
|
|
|
|
animationInfos.push_back(animationinfo);
|
2019-11-24 23:15:56 +08:00
|
|
|
animationinfoElement = animationinfoElement.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
auto csparsebinary = CreateCSParseBinary(*_builder,
|
|
|
|
_builder->CreateString(_csdVersion),
|
|
|
|
_builder->CreateVector(_textures),
|
|
|
|
_builder->CreateVector(_texturePngs),
|
|
|
|
nodeTree,
|
2019-11-24 23:15:56 +08:00
|
|
|
action,
|
2019-11-23 20:27:39 +08:00
|
|
|
_builder->CreateVector(animationInfos));
|
|
|
|
_builder->Finish(csparsebinary);
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
_textures.clear();
|
|
|
|
_texturePngs.clear();
|
|
|
|
}
|
|
|
|
return _builder;
|
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<NodeTree> FlatBuffersSerialize::createNodeTreeForSimulator(pugi::xml_node objectData,
|
|
|
|
std::string classType)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
std::string classname = classType.substr(0, classType.find("ObjectData"));
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG("classname = %s", classname.c_str());
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string name = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
Offset<Options> options;
|
|
|
|
std::vector<Offset<NodeTree>> children;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (classname == "ProjectNode")
|
|
|
|
{
|
|
|
|
auto projectNodeOptions = createProjectNodeOptionsForSimulator(objectData);
|
2019-11-24 23:15:56 +08:00
|
|
|
options = CreateOptions(*_builder, *(Offset<WidgetOptions>*)(&projectNodeOptions));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else if (classname == "SimpleAudio")
|
|
|
|
{
|
|
|
|
auto reader = ComAudioReader::getInstance();
|
2019-11-24 23:15:56 +08:00
|
|
|
auto tempOptions = reader->createOptionsWithFlatBuffers(objectData, _builder);
|
|
|
|
|
|
|
|
options = CreateOptions(*_builder, *(Offset<WidgetOptions>*)(&tempOptions));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::string readername = getGUIClassName(classname);
|
|
|
|
readername.append("Reader");
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
NodeReaderProtocol* reader = dynamic_cast<NodeReaderProtocol*>(ObjectFactory::getInstance()->createObject(readername));
|
|
|
|
if (reader != nullptr)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto tempOptions = reader->createOptionsWithFlatBuffers(objectData, _builder);
|
|
|
|
|
|
|
|
options = CreateOptions(*_builder, *(Offset<WidgetOptions>*)(&tempOptions));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// children
|
|
|
|
bool containChildrenElement = false;
|
2019-11-24 23:15:56 +08:00
|
|
|
auto child = objectData.first_child();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
// CCLOG("child name = %s", child.name());
|
|
|
|
|
|
|
|
if (strcmp("Children", child.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
containChildrenElement = true;
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (containChildrenElement)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
child = child.first_child();
|
|
|
|
// CCLOG("element name = %s", child.name());
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = child.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
bool bHasType = false;
|
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attriname == "ctype")
|
|
|
|
{
|
|
|
|
children.push_back(createNodeTreeForSimulator(child, value));
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
bHasType = true;
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
if (!bHasType)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
children.push_back(createNodeTreeForSimulator(child, "NodeObjectData"));
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
//
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
std::string customClassName = "";
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string attriname = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (attriname == "CustomClassName")
|
|
|
|
{
|
|
|
|
customClassName = value;
|
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateNodeTree(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
_builder->CreateString(classname),
|
|
|
|
_builder->CreateVector(children),
|
|
|
|
options,
|
|
|
|
_builder->CreateString(customClassName));
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
Offset<ProjectNodeOptions> FlatBuffersSerialize::createProjectNodeOptionsForSimulator(pugi::xml_node objectData)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
auto temp = NodeReader::getInstance()->createOptionsWithFlatBuffers(objectData, _builder);
|
|
|
|
auto nodeOptions = *(Offset<WidgetOptions>*)(&temp);
|
|
|
|
|
|
|
|
std::string filename = "";
|
|
|
|
float innerspeed = 1.0f;
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
pugi::xml_attribute objattri = objectData.first_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
// inneraction speed
|
|
|
|
while (objattri)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = objattri.name();
|
|
|
|
std::string value = objattri.value();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "InnerActionSpeed")
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
innerspeed = atof(objattri.value());
|
2019-11-23 20:27:39 +08:00
|
|
|
break;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
objattri = objattri.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
// FileData
|
2019-11-24 23:15:56 +08:00
|
|
|
auto child = objectData.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (child)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
std::string name = child.name();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "FileData")
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
auto attribute = child.first_attribute();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
while (attribute)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
name = attribute.name();
|
|
|
|
std::string value = attribute.value();
|
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
if (name == "Path")
|
|
|
|
{
|
|
|
|
filename = value;
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
attribute = attribute.next_attribute();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
|
|
|
child = child.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
2019-11-24 23:15:56 +08:00
|
|
|
|
2019-11-23 20:27:39 +08:00
|
|
|
return CreateProjectNodeOptions(*_builder,
|
2019-11-24 23:15:56 +08:00
|
|
|
nodeOptions,
|
|
|
|
_builder->CreateString(filename),
|
|
|
|
innerspeed);
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Serialize language XML file to Flat Buffers file. */
|
|
|
|
std::string FlatBuffersSerialize::serializeFlatBuffersWithXMLFileForLanguageData(const std::string& xmlFilePath,
|
2019-11-24 23:15:56 +08:00
|
|
|
const std::string& flatBuffersFilePath,
|
|
|
|
const std::string& languageName)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
|
|
|
//Read and parse XML data file.
|
|
|
|
if (!FileUtils::getInstance()->isFileExist(xmlFilePath))
|
|
|
|
return "Language XML file does not exist.";
|
|
|
|
std::string content = FileUtils::getInstance()->getStringFromFile(xmlFilePath);
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_document document;
|
|
|
|
if (!content.empty())
|
|
|
|
document.load_buffer_inplace(&content.front(), content.length());
|
|
|
|
pugi::xml_node element = document.document_element();
|
|
|
|
element = element.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
|
|
|
|
//Create FlatBuffers file using the language data in XML file.
|
|
|
|
_builder = new (std::nothrow) FlatBufferBuilder();
|
|
|
|
std::vector<Offset<LanguageItem>> langItemList;
|
|
|
|
while (element)
|
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
if (strcmp("language", element.name()) != 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
element = element.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Read all of the Key-Values in the XML file.
|
|
|
|
std::string key = "";
|
|
|
|
std::string text = "";
|
|
|
|
bool hasKeyReaded = false;
|
|
|
|
bool hasTextReaded = false;
|
2019-11-24 23:15:56 +08:00
|
|
|
pugi::xml_node childElement = element.first_child();
|
2019-11-23 20:27:39 +08:00
|
|
|
while (childElement)
|
|
|
|
{
|
|
|
|
//Record language key.
|
2019-11-24 23:15:56 +08:00
|
|
|
if (strcmp("key", childElement.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
key = childElement.text().as_string();
|
2019-11-23 20:27:39 +08:00
|
|
|
hasKeyReaded = true;
|
|
|
|
}
|
|
|
|
//Record corresponding text.
|
2019-11-24 23:15:56 +08:00
|
|
|
else if (strcmp(languageName.c_str(), childElement.name()) == 0)
|
2019-11-23 20:27:39 +08:00
|
|
|
{
|
2019-11-24 23:15:56 +08:00
|
|
|
const char* langText = childElement.text().as_string();
|
2019-11-23 20:27:39 +08:00
|
|
|
if (langText && langText[0] != '\0')
|
|
|
|
text = langText;
|
|
|
|
else
|
|
|
|
text = key;
|
|
|
|
hasTextReaded = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hasKeyReaded && hasTextReaded)
|
|
|
|
break;
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
childElement = childElement.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
Offset<flatbuffers::LanguageItem> langItem = CreateLanguageItem(*_builder, _builder->CreateString(key), _builder->CreateString(text));
|
|
|
|
langItemList.push_back(langItem);
|
|
|
|
|
2019-11-24 23:15:56 +08:00
|
|
|
element = element.next_sibling();
|
2019-11-23 20:27:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
auto langSet = CreateLanguageSet(*_builder, _builder->CreateVector(langItemList));
|
|
|
|
_builder->Finish(langSet);
|
|
|
|
bool isSuccess = flatbuffers::SaveFile(flatBuffersFilePath.c_str(),
|
|
|
|
reinterpret_cast<const char *>(_builder->GetBufferPointer()),
|
|
|
|
_builder->GetSize(),
|
|
|
|
true);
|
|
|
|
|
|
|
|
if (isSuccess)
|
|
|
|
return "";
|
|
|
|
else
|
|
|
|
return "Failed to save language .csb file.";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**/
|