128 lines
3.7 KiB
C++
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);
|
|
}
|