Files
bullet3/Extras/COLLADA_DOM/src/dae/daeMetaAttribute.cpp
ejcoumans a0f320764b Upgraded to latest COLLADA-DOM 1.2.0, see http://sourceforge.net/project/showfiles.php?group_id=157838
November 13, 2006
Re-applied the 'INF' fix for constraint limits.
2006-12-19 02:33:05 +00:00

175 lines
5.6 KiB
C++

/*
* Copyright 2006 Sony Computer Entertainment Inc.
*
* Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at:
* http://research.scea.com/scea_shared_source_license.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing permissions and limitations under the
* License.
*/
#include <dae/daeMetaAttribute.h>
#include <dae/daeMetaElement.h>
#include <dae/daeErrorHandler.h>
void
daeMetaAttribute::set(daeElement* e, daeString s)
{
if( _type->getTypeEnum() == daeAtomicType::FloatType || _type->getTypeEnum() == daeAtomicType::DoubleType ) {
if ( strcmp(s, "NaN") == 0 ) {
char msg[256];
sprintf(msg, "NaN encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() );
daeErrorHandler::get()->handleWarning(msg);
}
else if ( strcmp(s, "INF") == 0 ) {
//quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424
s = "999999.9";
//char msg[256];
//sprintf(msg, "INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() );
//daeErrorHandler::get()->handleWarning( msg );
}
else if ( strcmp(s, "-INF") == 0 ) {
s = "-999999.9";
//quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424
//char msg[256];
//sprintf(msg, "-INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() );
//daeErrorHandler::get()->handleWarning( msg );
}
}
_type->stringToMemory((char*)s, getWritableMemory(e));
}
void daeMetaAttribute::copy(daeElement* to, daeElement *from) {
daeChar str[4096];
_type->memoryToString( getWritableMemory(from), str, 4096 );
_type->stringToMemory( str, getWritableMemory( to ) );
//memcpy( getWritableMemory( to ), getWritableMemory( from ), getSize() );
}
void
daeMetaArrayAttribute::set(daeElement* e, daeString s)
{
if( _type->getTypeEnum() == daeAtomicType::FloatType || _type->getTypeEnum() == daeAtomicType::DoubleType ) {
if ( strcmp(s, "NaN") == 0 ) {
char msg[256];
sprintf(msg, "NaN encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() );
daeErrorHandler::get()->handleWarning(msg);
}
else if ( strcmp(s, "INF") == 0 ) {
s = "999999.9";
//quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424
//char msg[256];
//sprintf(msg, "INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() );
//daeErrorHandler::get()->handleWarning( msg );
}
else if ( strcmp(s, "-INF") == 0 ) {
s = "-999999.9";
//quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424
//char msg[256];
//sprintf(msg, "-INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() );
//daeErrorHandler::get()->handleWarning( msg );
}
}
daeArray* array = (daeArray*)getWritableMemory(e);
daeInt typeSize = _type->getSize();
daeInt cnt = (daeInt)array->getCount();
array->setRawCount(++cnt);
_type->stringToMemory((char*)s, array->getRawData()+(cnt-1)*typeSize);
}
void daeMetaArrayAttribute::copy(daeElement* to, daeElement *from) {
daeArray* toArray = (daeArray*)getWritableMemory(to);
daeArray* fromArray = (daeArray*)getWritableMemory(from);
daeInt typeSize = _type->getSize();
daeInt cnt = (daeInt)fromArray->getCount();
toArray->setRawCount( cnt );
//memcpy( toArray->getRawData(), fromArray->getRawData(), cnt * typeSize );
daeChar *toData = toArray->getRawData();
daeChar *fromData = fromArray->getRawData();
daeChar str[4096];
for ( int i = 0; i < cnt; i++ ) {
_type->memoryToString( fromData+i*typeSize, str, 2048 );
_type->stringToMemory( str, toData+i*typeSize );
}
}
daeMetaAttribute::daeMetaAttribute()
{
_name = "noname";
_offset = -1;
_type = NULL;
_container = NULL;
_default = NULL;
_isRequired = false;
}
void
daeMetaAttribute::resolve(daeElementRef element)
{
if (_type != NULL)
_type->resolve(element, getWritableMemory(element) );
}
void
daeMetaArrayAttribute::resolve(daeElementRef element)
{
daeArray* era = (daeArray*)getWritableMemory(element);
size_t cnt = era->getCount();
for ( size_t i = 0; i < cnt; i++ )
{
_type->resolve( element, era->getRawData()+(i*era->getElementSize()) );
}
}
daeInt
daeMetaAttribute::getSize()
{
return _type->getSize();
}
daeInt
daeMetaAttribute::getAlignment()
{
return _type->getAlignment();
}
daeInt
daeMetaAttribute::getCount(daeElement* e)
{
if (e == NULL)
return 0;
return (getWritableMemory(e) != NULL);
}
daeMemoryRef
daeMetaAttribute::get(daeElement *e, daeInt index)
{
(void)index;
return getWritableMemory(e);
}
daeInt
daeMetaArrayAttribute::getCount(daeElement *e)
{
if (e == NULL)
return 0;
daeArray* era = (daeArray*)getWritableMemory(e);
if (era == NULL)
return 0;
return (daeInt)era->getCount();
}
daeMemoryRef
daeMetaArrayAttribute::get(daeElement* e, daeInt index)
{
if (e == NULL)
return NULL;
daeArray* era = (daeArray*)getWritableMemory(e);
if (era == NULL || index >= (daeInt)era->getCount() )
return NULL;
return era->getRawData()+(index*era->getElementSize());
}