diff options
author | Alex Sakhartchouk <alexst@google.com> | 2011-02-04 10:41:05 -0800 |
---|---|---|
committer | Alex Sakhartchouk <alexst@google.com> | 2011-02-04 10:41:05 -0800 |
commit | 87ac3e2db6d5ae163131102c066e9d19bdfdc139 (patch) | |
tree | 8bd1acdae6481671262b60318ce67a7ddb554c2a /src/dae/daeMetaElementAttribute.cpp | |
parent | 36c504662cd1f55141297c216dc7646c7d62e76c (diff) | |
download | collada-87ac3e2db6d5ae163131102c066e9d19bdfdc139.tar.gz |
Collada Dom 1.4
Used by the geometry converter tool
Change-Id: Ifec30e54a5d041f82e9dfa293421e1c4335585fb
Diffstat (limited to 'src/dae/daeMetaElementAttribute.cpp')
-rwxr-xr-x | src/dae/daeMetaElementAttribute.cpp | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/dae/daeMetaElementAttribute.cpp b/src/dae/daeMetaElementAttribute.cpp new file mode 100755 index 0000000..5de214d --- /dev/null +++ b/src/dae/daeMetaElementAttribute.cpp @@ -0,0 +1,231 @@ +/*
+* Copyright 2006 Sony Computer Entertainment Inc.
+*
+* Licensed under the MIT Open Source License, for details please see license.txt or the website
+* http://www.opensource.org/licenses/mit-license.php
+*
+*/ + +#include <dae/daeMetaElementAttribute.h> +#include <dae/daeMetaElement.h> + +daeMetaElementAttribute::daeMetaElementAttribute( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : daeMetaCMPolicy( container, parent, ordinal, minO, maxO ) +{ + _elementType = NULL; +} + +daeMetaElementAttribute::~daeMetaElementAttribute() +{} + +daeMetaElementArrayAttribute::daeMetaElementArrayAttribute( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : daeMetaElementAttribute( container, parent, ordinal, minO, maxO ) +{ +} + +daeMetaElementArrayAttribute::~daeMetaElementArrayAttribute() +{} + + +void daeMetaElementAttribute::set(daeElement* e, daeString s) +{ + //_type->stringToMemory((char*)s, getWritableMemory(e)); + daeElementRef *ref = (daeElementRef*)(getWritableMemory(e)); + if ((*ref) == NULL) { + (*ref) = _elementType->create(); + } + (*ref)->getMeta()->getValueAttribute()->stringToMemory((*ref), s); +} + +void daeMetaElementAttribute::copy(daeElement* to, daeElement *from) { + daeElement *cpy = (*(daeElementRef*)(getWritableMemory(from)))->clone(); + (*(daeElementRef*)(getWritableMemory(to))) = cpy; +} + +void daeMetaElementArrayAttribute::copy(daeElement* to, daeElement *from) { + (void)to; + (void)from; +} + +void +daeMetaElementAttribute::setDocument( daeElement * parent, daeDocument* c ) +{ + daeElementRef* er = (daeElementRef*)getWritableMemory( parent ); + if ( ((daeElement*)(*er)) != NULL ) { + (*er)->setDocument( c ); + } +} + +void +daeMetaElementArrayAttribute::setDocument( daeElement * parent, daeDocument* c ) +{ + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory( parent ); + for ( unsigned int i = 0; i < era->getCount(); i++ ) { + era->get(i)->setDocument( c ); + } +} + +daeInt +daeMetaElementAttribute::getCount(daeElement* e) +{ + if (e == NULL) + return 0; + return ((*((daeElementRef*)getWritableMemory(e))) != NULL); +} + +daeMemoryRef +daeMetaElementAttribute::get(daeElement *e, daeInt index) +{ + (void)index; + return getWritableMemory(e); +} + +daeInt +daeMetaElementArrayAttribute::getCount(daeElement *e) +{ + if (e == NULL) + return 0; + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(e); + if (era == NULL) + return 0; + return (daeInt)era->getCount(); +} + +daeMemoryRef +daeMetaElementArrayAttribute::get(daeElement* e, daeInt index) +{ + if (e == NULL) + return NULL; + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(e); + if (era == NULL || index >= (daeInt)era->getCount() ) + return NULL; + return (daeMemoryRef)&(era->get(index)); +} + +daeElement * +daeMetaElementAttribute::placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) +{ + (void)offset; + (void)before; + (void)after; + if ((parent == NULL)||(child == NULL)) + return NULL; + if ( child->getMeta() != _elementType || strcmp( child->getElementName(), _name ) != 0 ) { + return NULL; + } + if (child->getParentElement() == parent) { + //I Don't know why this gets called when the child already has this as parent. + return child; + } + daeElementRef* er = (daeElementRef*)getWritableMemory(parent); + + if ( *er != NULL ) + { + return NULL; + } + + daeElement::removeFromParent( child ); + child->setParentElement( parent ); + + *er = child; + ordinal = _ordinalOffset; + + return child; +} + +daeElement * +daeMetaElementArrayAttribute::placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) +{ + if ((parent == NULL)||(child == NULL)) + return NULL; + if ( child->getMeta() != _elementType) + return NULL; + + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent); + if ( _maxOccurs != -1 && (daeInt)era->getCount()-offset >= _maxOccurs ) { + return NULL; + } + + if (strcmp( child->getElementName(), _name ) != 0 ) + return NULL; + + daeElement *p = child->getParentElement(); + removeElement( p, child ); + child->setParentElement( parent ); + + if ( before != NULL && before->getMeta() == _elementType ) { + size_t idx(0); + if ( era->find( before, idx ) == DAE_OK ) { + era->insertAt( idx, child ); + } + } + else if ( after != NULL && after->getMeta() == _elementType ) { + size_t idx(0); + if ( era->find( after, idx ) == DAE_OK ) { + era->insertAt( idx+1, child ); + } + } + else { + era->append(child); + } + ordinal = _ordinalOffset; + + return child; +} + +// These are the opposite of the placeElement functions above +daeBool +daeMetaElementAttribute::removeElement(daeElement* parent, daeElement* child) +{ + (void)child; // silence unused variable warning + + if ((parent == NULL)||(child == NULL )) + return false; + + daeElementRef* er = (daeElementRef*)getWritableMemory(parent); + if ( *er != child ) { + return false; + } + *er = NULL; + return true; +} + +daeBool +daeMetaElementArrayAttribute::removeElement(daeElement* parent, + daeElement* child) +{ + if ((parent == NULL)||(child == NULL)) + return false ; + + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent); +/* if ( (daeInt)era->getCount() <= _minOccurs ) { + return false; + }*/ + daeInt error = era->remove(child); + if ( error != DAE_OK ) { + return false; + } + return true; +} + +daeMetaElement *daeMetaElementAttribute::findChild( daeString elementName ) { + if ( strcmp( elementName, _name ) == 0 ) { + return _elementType; + } + return NULL; +} + +void daeMetaElementAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) { + daeElementRef* er = (daeElementRef*)getWritableMemory(parent); + if ( *er != NULL ) { + array.appendUnique( *er ); + } +} + +void daeMetaElementArrayAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) { + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent); + size_t cnt = era->getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + array.appendUnique( era->get(x) ); + } +} |