• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2006 Sony Computer Entertainment Inc.
3 *
4 * Licensed under the MIT Open Source License, for details please see license.txt or the website
5 * http://www.opensource.org/licenses/mit-license.php
6 *
7 */
8 
9 #include <dae/daeRawResolver.h>
10 #include <dae.h>
11 #include <dae/daeURI.h>
12 #include <dae/daeErrorHandler.h>
13 #include <dae/daeUtils.h>
14 
15 using namespace std;
16 
daeRawResolver(DAE & dae)17 daeRawResolver::daeRawResolver(DAE& dae) : daeURIResolver(dae)
18 {
19 }
20 
~daeRawResolver()21 daeRawResolver::~daeRawResolver()
22 {
23 }
24 
25 daeString
getName()26 daeRawResolver::getName()
27 {
28 	return "RawResolver";
29 }
30 
resolveElement(const daeURI & uri)31 daeElement* daeRawResolver::resolveElement(const daeURI& uri) {
32 	if (cdom::tolower(uri.pathExt()).find(".raw") == string::npos)
33 		return NULL;
34 
35 	daeRawRefCache& cache = dae->getRawRefCache();
36 	if (daeElement* elt = cache.lookup(uri))
37 		return elt;
38 
39 	string fileName = cdom::uriToNativePath(uri.str());
40 	if (fileName.empty())
41 	{
42 		daeErrorHandler::get()->handleError( "daeRawResolver::resolveElement() - Can't get path from URI\n" );
43 		return NULL;
44 	}
45 	FILE *rawFile = fopen(fileName.c_str(), "rb");
46 	if (rawFile == NULL )
47 		return NULL;
48 	long byteOffset = atoi( uri.getID() ); //get the fragment
49 
50 	daeElement *src;
51 	daeElement *array;
52 	daeElement *accessor;
53 
54 	accessor = uri.getContainer();
55 	if ( accessor == NULL )
56 		return NULL;
57 	src = accessor->getParentElement()->getParentElement();
58 	daeElementRefArray children;
59 	accessor->getChildren( children );
60 	bool hasInts = children[0]->getAttribute("type") == "int";
61 
62 	if ( hasInts )
63 	{
64 		array = src->createAndPlace( "int_array" );
65 	}
66 	else
67 	{
68 		array = src->createAndPlace( "float_array" );
69 	}
70 
71 	daeULong *countPtr = (daeULong*)accessor->getAttributeValue( "count" );
72 	daeULong count = countPtr != NULL ? *countPtr : 0;
73 
74 	daeULong *stridePtr = (daeULong*)accessor->getAttributeValue( "stride" );
75 	daeULong stride = stridePtr != NULL ? *stridePtr : 1;
76 
77 	*(daeULong*)(array->getAttributeValue("count")) = count*stride;
78 	array->setAttribute( "id", (src->getAttribute("id") + "-array").c_str() );
79 
80 	daeArray *valArray = (daeArray*)array->getValuePointer();
81 	valArray->setCount( (size_t)(count*stride) );
82 
83 	fseek( rawFile, byteOffset, SEEK_SET );
84 	if ( hasInts )
85 	{
86 		daeInt val;
87 		for ( unsigned int i = 0; i < count*stride; i++ )
88 		{
89 			fread( &val, sizeof(daeInt), 1, rawFile );
90 			*(daeLong*)(valArray->getRaw(i)) = (daeLong)val;
91 		}
92 	}
93 	else
94 	{
95 		daeFloat val;
96 		for ( unsigned int i = 0; i < count*stride; i++ )
97 		{
98 			fread( &val, sizeof(daeFloat), 1, rawFile );
99 			*(daeDouble*)(valArray->getRaw(i)) = (daeDouble)val;
100 		}
101 	}
102 
103 	fclose(rawFile);
104 	cache.add(uri, array);
105 	return array;
106 }
107 
108 
lookup(const daeURI & uri)109 daeElement* daeRawRefCache::lookup(const daeURI& uri) {
110 	map<string, daeElement*>::iterator iter = lookupTable.find(uri.str());
111 	return iter == lookupTable.end() ? NULL : iter->second;
112 }
113 
add(const daeURI & uri,daeElement * elt)114 void daeRawRefCache::add(const daeURI& uri, daeElement* elt) {
115 	lookupTable[uri.str()] = elt;
116 }
117 
remove(const daeURI & uri)118 void daeRawRefCache::remove(const daeURI& uri) {
119 	lookupTable.erase(uri.str());
120 }
121 
clear()122 void daeRawRefCache::clear() {
123 	lookupTable.clear();
124 }
125