Files
bullet3/Extras/FCollada/FCDocument/FCDEntity.cpp
2006-05-25 19:18:29 +00:00

128 lines
3.7 KiB
C++

/*
Copyright (C) 2005-2006 Feeling Software Inc.
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
/*
Based on the FS Import classes:
Copyright (C) 2005-2006 Feeling Software Inc
Copyright (C) 2005-2006 Autodesk Media Entertainment
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
#include "StdAfx.h"
#include "FCDocument/FCDEntity.h"
#include "FCDocument/FCDExtra.h"
#include "FCDocument/FCDSceneNode.h"
#include "FUtils/FUDaeParser.h"
#include "FUtils/FUDaeWriter.h"
#include "FUtils/FUUniqueStringMap.h"
using namespace FUDaeParser;
using namespace FUDaeWriter;
FCDEntity::FCDEntity(FCDocument* document, const char* baseId) : FCDObjectWithId(document, baseId)
{
extra = new FCDExtra(document);
}
FCDEntity::~FCDEntity()
{
SAFE_DELETE(extra);
}
// Structure cloning
void FCDEntity::Clone(FCDEntity* clone)
{
FCDObjectWithId::Clone(clone);
clone->name = name;
clone->note = note;
}
void FCDEntity::SetName(const fstring& _name)
{
name = CleanName(_name);
}
// Parse this entity information from the COLLADA XML document
FUStatus FCDEntity::LoadFromXML(xmlNode* entityNode)
{
FUStatus status;
string fileId = FUDaeParser::ReadNodeId(entityNode);
if (!fileId.empty()) SetDaeId(fileId);
else RemoveDaeId();
name = TO_FSTRING(FUDaeParser::ReadNodeName(entityNode));
if (name.empty()) name = TO_FSTRING(fileId);
xmlNode* extraNode = FindChildByType(entityNode, DAE_EXTRA_ELEMENT);
if (extraNode != NULL)
{
extra->LoadFromXML(extraNode);
// Look for an extra node at this level and a Max/Maya-specific technique
FCDETechnique* mayaTechnique = extra->FindTechnique(DAEMAYA_MAYA_PROFILE);
FCDETechnique* maxTechnique = extra->FindTechnique(DAEMAX_MAX_PROFILE);
// Read in all the extra parameters
StringList parameterNames;
FCDENodeList parameterNodes;
if (mayaTechnique != NULL) mayaTechnique->FindParameters(parameterNodes, parameterNames);
if (maxTechnique != NULL) maxTechnique->FindParameters(parameterNodes, parameterNames);
// Look for the note and user-properties, which is the only parameter currently supported at this level
size_t parameterCount = parameterNodes.size();
for (size_t i = 0; i < parameterCount; ++i)
{
FCDENode* parameterNode = parameterNodes[i];
const string& parameterName = parameterNames[i];
if (parameterName == DAEMAX_USERPROPERTIES_NODE_PARAMETER || parameterName == DAEMAYA_NOTE_PARAMETER
|| parameterName == DAEMAX_USERPROPERTIES_NODE_PARAMETER1_3 || parameterName == DAEMAYA_MAYA_NOTE_PARAMETER1_3)
{
note = parameterNode->GetContent();
parameterNode->Release();
}
}
}
return status;
}
// Look for a children with the given COLLADA Id.
FCDEntity* FCDEntity::FindDaeId(const string& _daeId)
{
if (GetDaeId() == _daeId) return this;
return NULL;
}
xmlNode* FCDEntity::WriteToXML(xmlNode* parentNode) const
{
return WriteToEntityXML(parentNode, DAEERR_UNKNOWN_ELEMENT);
}
xmlNode* FCDEntity::WriteToEntityXML(xmlNode* parentNode, const char* nodeName) const
{
// Create the entity node and write out the id and name attributes
xmlNode* entityNode = AddChild(parentNode, nodeName);
AddAttribute(entityNode, DAE_ID_ATTRIBUTE, GetDaeId());
if (!name.empty())
{
AddAttribute(entityNode, DAE_NAME_ATTRIBUTE, name);
}
return entityNode;
}
void FCDEntity::WriteToExtraXML(xmlNode* entityNode) const
{
// Write out the note
if (HasNote())
{
xmlNode* techniqueNode = AddExtraTechniqueChild(entityNode, DAEMAX_MAX_PROFILE);
AddChild(techniqueNode, DAEMAX_USERPROPERTIES_NODE_PARAMETER, note);
}
// Write out the user-defined extra information.
extra->WriteToXML(entityNode);
}