blob: 1666bb685818332506b66976534a1ba84b963f39 [file] [log] [blame]
/*
* 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/daeRawResolver.h>
#include <dae.h>
#include <dae/daeURI.h>
#include <dae/daeErrorHandler.h>
#include <dae/daeUtils.h>
using namespace std;
daeRawResolver::daeRawResolver(DAE& dae) : daeURIResolver(dae)
{
}
daeRawResolver::~daeRawResolver()
{
}
daeString
daeRawResolver::getName()
{
return "RawResolver";
}
daeElement* daeRawResolver::resolveElement(const daeURI& uri) {
if (cdom::tolower(uri.pathExt()).find(".raw") == string::npos)
return NULL;
daeRawRefCache& cache = dae->getRawRefCache();
if (daeElement* elt = cache.lookup(uri))
return elt;
string fileName = cdom::uriToNativePath(uri.str());
if (fileName.empty())
{
daeErrorHandler::get()->handleError( "daeRawResolver::resolveElement() - Can't get path from URI\n" );
return NULL;
}
FILE *rawFile = fopen(fileName.c_str(), "rb");
if (rawFile == NULL )
return NULL;
long byteOffset = atoi( uri.getID() ); //get the fragment
daeElement *src;
daeElement *array;
daeElement *accessor;
accessor = uri.getContainer();
if ( accessor == NULL )
return NULL;
src = accessor->getParentElement()->getParentElement();
daeElementRefArray children;
accessor->getChildren( children );
bool hasInts = children[0]->getAttribute("type") == "int";
if ( hasInts )
{
array = src->createAndPlace( "int_array" );
}
else
{
array = src->createAndPlace( "float_array" );
}
daeULong *countPtr = (daeULong*)accessor->getAttributeValue( "count" );
daeULong count = countPtr != NULL ? *countPtr : 0;
daeULong *stridePtr = (daeULong*)accessor->getAttributeValue( "stride" );
daeULong stride = stridePtr != NULL ? *stridePtr : 1;
*(daeULong*)(array->getAttributeValue("count")) = count*stride;
array->setAttribute( "id", (src->getAttribute("id") + "-array").c_str() );
daeArray *valArray = (daeArray*)array->getValuePointer();
valArray->setCount( (size_t)(count*stride) );
fseek( rawFile, byteOffset, SEEK_SET );
if ( hasInts )
{
daeInt val;
for ( unsigned int i = 0; i < count*stride; i++ )
{
fread( &val, sizeof(daeInt), 1, rawFile );
*(daeLong*)(valArray->getRaw(i)) = (daeLong)val;
}
}
else
{
daeFloat val;
for ( unsigned int i = 0; i < count*stride; i++ )
{
fread( &val, sizeof(daeFloat), 1, rawFile );
*(daeDouble*)(valArray->getRaw(i)) = (daeDouble)val;
}
}
fclose(rawFile);
cache.add(uri, array);
return array;
}
daeElement* daeRawRefCache::lookup(const daeURI& uri) {
map<string, daeElement*>::iterator iter = lookupTable.find(uri.str());
return iter == lookupTable.end() ? NULL : iter->second;
}
void daeRawRefCache::add(const daeURI& uri, daeElement* elt) {
lookupTable[uri.str()] = elt;
}
void daeRawRefCache::remove(const daeURI& uri) {
lookupTable.erase(uri.str());
}
void daeRawRefCache::clear() {
lookupTable.clear();
}