2
// Copyright 1997 - 2001, Paul C. Gregory
4
// Contact: pgregory@aqsis.com
6
// This library is free software; you can redistribute it and/or
7
// modify it under the terms of the GNU Lesser General Public
8
// License as published by the Free Software Foundation; either
9
// version 2.1 of the License, or (at your option) any later version.
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
// General Public License for more details.
16
// You should have received a copy of the GNU General Public
17
// License along with this library; if not, write to the Free Software
18
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
* \brief This dictionary can handle inline declaration as described in RiSpec V3.2
22
* \author Lionel J. Lacour (intuition01@online.fr)
29
#include "dictionary.h"
30
#include "inlineparse.h"
33
USING_NAMESPACE( libri2rib );
39
void SqTokenEntry::printClassType ()
44
case CONSTANT: cout << "CONSTANT"; break;
45
case UNIFORM: cout << "UNIFORM"; break;
46
case VARYING: cout << "VARYING"; break;
47
case VERTEX: cout << "VERTEX"; break;
48
case FACEVARYING: cout <<"FACEVARYING";
53
case HPOINT: cout << "HPOINT"; break;
54
case MATRIX: cout << "MATRIX"; break;
55
case NORMAL: cout << "NORMAL"; break;
56
case VECTOR: cout << "VECTOR"; break;
57
case FLOAT: cout << "FLOAT"; break;
58
case INTEGER: cout << "INTEGER"; break;
59
case STRING: cout << "STRING"; break;
60
case POINT: cout << "POINT"; break;
61
case COLOR: cout << "COLOR";
68
CqDictionary::CqDictionary()
70
addToken( RI_KA, UNIFORM, FLOAT );
71
addToken( RI_KD, UNIFORM, FLOAT );
72
addToken( RI_KS, UNIFORM, FLOAT );
73
addToken( RI_KR, UNIFORM, FLOAT );
74
addToken( RI_ROUGHNESS, UNIFORM, FLOAT );
75
addToken( RI_TEXTURENAME, UNIFORM, STRING );
76
addToken( RI_SPECULARCOLOR, UNIFORM, COLOR );
77
addToken( RI_INTENSITY, UNIFORM, FLOAT );
78
addToken( RI_LIGHTCOLOR, UNIFORM, COLOR );
79
addToken( RI_FROM, UNIFORM, POINT );
80
addToken( RI_TO, UNIFORM, POINT );
81
addToken( RI_CONEANGLE, UNIFORM, FLOAT );
82
addToken( RI_CONEDELTAANGLE, UNIFORM, FLOAT );
83
addToken( RI_BEAMDISTRIBUTION, UNIFORM, FLOAT );
84
addToken( RI_MINDISTANCE, UNIFORM, FLOAT );
85
addToken( RI_MAXDISTANCE, UNIFORM, FLOAT );
86
addToken( RI_DISTANCE, UNIFORM, FLOAT );
87
addToken( RI_BACKGROUND, UNIFORM, COLOR );
88
addToken( RI_FOV, UNIFORM, FLOAT );
89
addToken( RI_P, VERTEX, POINT );
90
addToken( RI_PZ, VERTEX, POINT );
91
addToken( RI_PW, VERTEX, HPOINT );
92
addToken( RI_N, VARYING, NORMAL );
93
addToken( RI_NP, UNIFORM, NORMAL );
94
addToken( RI_CS, VARYING, COLOR );
95
addToken( RI_OS, VARYING, COLOR );
96
addToken( RI_S, VARYING, FLOAT );
97
addToken( RI_T, VARYING, FLOAT );
98
addToken( RI_ST, VARYING, FLOAT, 2 );
100
addToken ( RI_AMPLITUDE, UNIFORM, FLOAT );
101
addToken ( RI_WIDTH, VARYING, FLOAT );
102
addToken ( RI_CONSTANTWIDTH, CONSTANT, FLOAT );
104
addToken( "gridsize", UNIFORM, INTEGER );
105
addToken( "texturememory", UNIFORM, INTEGER );
106
addToken( "bucketsize", UNIFORM, INTEGER, 2 );
107
addToken( "eyesplits", UNIFORM, INTEGER );
108
addToken( RI_SHADER, UNIFORM, STRING );
109
addToken( "archive", UNIFORM, STRING );
110
addToken( "texture", UNIFORM, STRING );
111
addToken( "display", UNIFORM, STRING );
112
addToken( "auto_shadows", UNIFORM, STRING );
113
addToken( "endofframe", UNIFORM, INTEGER );
114
addToken( "sphere", UNIFORM, FLOAT );
115
addToken( "coordinatesystem", UNIFORM, STRING );
116
addToken( "shadows", UNIFORM, STRING );
117
addToken( "shadowmapsize", UNIFORM, INTEGER, 2 );
118
addToken( "shadowangle", UNIFORM, FLOAT );
119
addToken( "shadowmapname", UNIFORM, STRING );
120
addToken( "shadow_shadingrate", UNIFORM, FLOAT );
121
addToken( RI_NAME, UNIFORM, STRING );
122
addToken( "shadinggroup", UNIFORM, STRING );
123
addToken( "sense", UNIFORM, STRING );
124
addToken( "compression", UNIFORM, STRING );
125
addToken( "quality", UNIFORM, INTEGER );
126
addToken( "bias0", UNIFORM, FLOAT );
127
addToken( "bias1", UNIFORM, FLOAT );
128
addToken( "jitter", UNIFORM, INTEGER );
129
addToken( "depthfilter", UNIFORM, STRING );
133
// If the token already exists, addToken() return the corresponding id
134
TqTokenId CqDictionary::addToken ( std::string n, EqTokenClass tc, EqTokenType tt, TqUint qnt, TqBool inln )
136
std::vector<SqTokenEntry>::iterator first = te.begin();
139
for ( i = 1;first != te.end();first++, i++ )
141
if ( ( n == first->name ) &&
142
( tc == first->tclass ) &&
143
( tt == first->ttype ) &&
144
( qnt == first->quantity ) )
148
te.push_back( SqTokenEntry ( n, tc, tt, qnt, inln ) );
152
// If the token given as input is in fact an inline definition,
153
// getTokenId() will add it to the dictionary.
154
TqTokenId CqDictionary::getTokenId ( std::string n )
160
if ( ip.isInline() == TqTrue )
162
j = addToken ( ip.getIdentifier(), ip.getClass(), ip.getType(), ip.getQuantity(), TqTrue );
166
std::vector<SqTokenEntry>::iterator first = te.begin();
168
for ( i = 1;first != te.end();first++, i++ )
170
if ( ( n == first->name ) && ( first->in_line == TqFalse ) )
175
std::string st( "Token not declared: " );
177
throw CqError( RIE_ILLSTATE, RIE_ERROR, st, TqFalse );
184
TqUint CqDictionary::allocSize ( TqTokenId id, TqUint vertex, TqUint varying, TqUint uniform, TqUint facevarying )
187
std::vector<SqTokenEntry>::iterator first = te.begin();
189
size = getTypeSize( first->ttype );
190
switch ( first->tclass )
192
case VERTEX: size *= vertex;
194
case VARYING: size *= varying;
196
case UNIFORM: size *= uniform;
200
case FACEVARYING: size *= facevarying;
203
size *= ( first->quantity );
207
TqUint CqDictionary::getTypeSize ( EqTokenType t )
211
case FLOAT: return 1;
212
case POINT: return 3;
213
case VECTOR: return 3;
214
case NORMAL: return 3;
215
case COLOR: return 1;
216
case STRING: return 1;
217
case MATRIX: return 16;
218
case HPOINT: return 4;
219
case INTEGER: return 1;
221
throw CqError( RIE_BUG, RIE_SEVERE,
222
"CqDictionary::getTypeSize(TokenType) --> Unknown token type", TqFalse );
226
void CqDictionary::isValid ( TqTokenId id )
228
if ( id > te.size() || id == 0 )
229
throw CqError( RIE_BUG, RIE_SEVERE,
230
"CqDictionary::isValid(TokenId) --> Bad ID", TqFalse );
233
EqTokenType CqDictionary::getType ( TqTokenId id )
236
std::vector<SqTokenEntry>::iterator first = te.begin();
237
return ( ( first + id - 1 ) ->ttype );
240
TqUint CqDictionary::getQuantity ( TqTokenId id )
243
std::vector<SqTokenEntry>::iterator first = te.begin();
244
return ( ( first + id - 1 ) ->quantity );
248
void CqDictionary::stats ()
250
std::vector<SqTokenEntry>::iterator first = te.begin();
254
cout << "Dictionary Number of entries: " << te.size() << endl;
255
cout << "------------------------------------------------------" << endl;
256
cout << "NAME CLASS TYPE [SIZE] IS_INLINE" << endl;
257
cout << "------------------------------------------------------" << endl;
259
for ( i = 1;first != te.end();first++, i++ )
261
cout << std::setw( 20 ) << std::setfill ( ' ' );
262
cout << std::setiosflags( ios::left ) << ( first->name ).c_str() << " ";
263
first->printClassType ();
264
cout << "[" << getQuantity( i ) << "] ";
265
if ( ( first->in_line ) == TqTrue )
271
cout << "------------------------------------------------------" << endl;