Material* SceneImporter<real>::ReadBlinnPhongMaterial( std::istream& stream, const std::string& name ) { BlinnPhongMaterial<real>* material = new BlinnPhongMaterial<real>; material->SetSurface( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetAmbient( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetDiffuse( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetSpecular( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetMetallic( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetReflection( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetRefraction( ReadColor( stream ) ); ReadNextExactToken( stream, "," ); material->SetRefractionIndex( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); material->SetShininess( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); material->SetWireframe( ReadBoolean( stream ) ); ReadNextExactToken( stream, "," ); material->SetTexture( GetTexture( ReadNextToken( stream ) ) ); ReadNextExactToken( stream, "," ); Texture<real>* environment = GetTexture( ReadNextToken( stream ) ); if ( environment && ( environment->GetTextureType() != Texture<real>::TypeCubeMap ) ) throw "Environment must be a CubeMap"; material->SetEnvironment( (CubeMap<real>*)environment ); material->SetName( name ); return material; }
void SceneImporter<real>::ReadCameraHeader( std::istream& stream, Camera<real>* ioCamera ) { ReadCameraNodeHeader( stream, ioCamera ); ReadNextExactToken( stream, "," ); ioCamera->SetFieldOfView( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); ioCamera->SetNearClipping( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); ioCamera->SetFarClipping( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); ioCamera->SetFocalDistance( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); ioCamera->SetLensRadius( ReadReal( stream ) ); }
Matrix3<real> SceneImporter<real>::ReadMatrix3( std::istream& stream ) { ReadNextExactToken( stream, "Matrix3" ); ReadNextExactToken( stream, "(" ); if ( TryReadClosingParenthesis( stream ) ) { Matrix3<real> result; result.SetIdentity(); return result; } real m00 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m01 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m02 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m10 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m11 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m12 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m20 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m21 = ReadReal( stream ); ReadNextExactToken( stream, "," ); real m22 = ReadReal( stream ); Matrix3<real> result = Matrix3<real>( m00, m01, m02, m10, m11, m12, m20, m21, m22 ); ReadNextExactToken( stream, ")" ); return result; }
Node<real>* SceneImporter<real>::ReadPlane( std::istream& stream, const std::string& name ) { Plane<real>* plane = new Plane<real>; plane->SetName( name ); ReadGeometryHeader( stream, plane ); ReadNextExactToken( stream, "," ); real sizeZ = ReadReal( stream ); ReadNextExactToken( stream, "," ); real sizeX = ReadReal( stream ); plane->SetSizes( sizeZ, sizeX ); return plane; }
Node<real>* SceneImporter<real>::ReadCylinder( std::istream& stream, const std::string& name ) { Cylinder<real>* cylinder = new Cylinder<real>; cylinder->SetName( name ); ReadGeometryHeader( stream, cylinder ); ReadNextExactToken( stream, "," ); real height = ReadReal( stream ); ReadNextExactToken( stream, "," ); real radius = ReadReal( stream ); ReadNextExactToken( stream, "," ); real radiusSubdivisions = ReadUnsignedInt( stream ); cylinder->SetSizes( height, radius, radiusSubdivisions ); return cylinder; }
Node<real>* SceneImporter<real>::ReadBox( std::istream& stream, const std::string& name ) { Box<real>* box = new Box<real>; box->SetName( name ); ReadGeometryHeader( stream, box ); ReadNextExactToken( stream, "," ); real sizeX = ReadReal( stream ); ReadNextExactToken( stream, "," ); real sizeY = ReadReal( stream ); ReadNextExactToken( stream, "," ); real sizeZ = ReadReal( stream ); box->SetSizes( sizeX, sizeY, sizeZ ); return box; }
Vector2<real> SceneImporter<real>::ReadVector2( std::istream& stream ) { ReadNextExactToken( stream, "Vector2" ); ReadNextExactToken( stream, "(" ); if ( TryReadClosingParenthesis( stream ) ) return Vector2<real>( 0, 0 ); real X = ReadReal( stream ); ReadNextExactToken( stream, "," ); real Y = ReadReal( stream ); Vector2<real> result = Vector2<real>( X, Y ); ReadNextExactToken( stream, ")" ); return result; }
Camera<real>* SceneImporter<real>::ReadTurntableCamera( std::istream& stream, const std::string& name ) { TurntableCamera<real>* camera = new TurntableCamera<real>(); camera->SetName( name ); ReadCameraHeader( stream, camera ); ReadNextExactToken( stream, "," ); camera->SetCenter( ReadVector3( stream ) ); ReadNextExactToken( stream, "," ); camera->SetRotationThetaAxis( ReadVector3( stream ) ); ReadNextExactToken( stream, "," ); camera->SetRotationPhiAxis( ReadVector3( stream ) ); ReadNextExactToken( stream, "," ); camera->SetRotationPhi( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); camera->SetRotationTheta( ReadReal( stream ) ); ReadNextExactToken( stream, "," ); camera->SetDistance( ReadReal( stream ) ); return camera; }
Color<real> SceneImporter<real>::ReadColor( std::istream& stream ) { ReadNextExactToken( stream, "Color" ); ReadNextExactToken( stream, "(" ); if ( TryReadClosingParenthesis( stream ) ) return Color<real>( 0, 0, 0, 1 ); real R = ReadReal( stream ); ReadNextExactToken( stream, "," ); real G = ReadReal( stream ); ReadNextExactToken( stream, "," ); real B = ReadReal( stream ); ReadNextExactToken( stream, "," ); real A = ReadReal( stream ); Color<real> result = Color<real>( R, G, B, A ); ReadNextExactToken( stream, ")" ); return result; }
Light<real>* SceneImporter<real>::ReadSpotLight( std::istream& stream, const std::string& name ) { SpotLight<real>* light = new SpotLight<real>; light->SetName( name ); ReadLightHeader( stream, light ); ReadNextExactToken( stream, "," ); light->SetDirection( ReadVector3( stream ) ); ReadNextExactToken( stream, "," ); light->SetAperture( ReadReal( stream ) ); return light; }
Node<real>* SceneImporter<real>::ReadSphere( std::istream& stream, const std::string& name ) { Sphere<real>* sphere = new Sphere<real>; sphere->SetName( name ); ReadGeometryHeader( stream, sphere ); ReadNextExactToken( stream, "," ); real radius = ReadReal( stream ); ReadNextExactToken( stream, "," ); real latitudeSubdivisions = ReadUnsignedInt( stream ); ReadNextExactToken( stream, "," ); real longitudeSubdivisions = ReadUnsignedInt( stream ); sphere->SetSizes( radius, latitudeSubdivisions, longitudeSubdivisions ); return sphere; }
/* Reads next symbol */ static void InSymbol(LPIT8 it8) { register char *idptr; register int k; SYMBOL key; int sng; do { while (isseparator(it8->ch)) NextCh(it8); if (isfirstidchar(it8->ch)) { /* Identifier */ k = 0; idptr = it8->id; do { if (++k < MAXID) *idptr++ = (char) it8->ch; NextCh(it8); } while (isidchar(it8->ch)); *idptr = '\0'; xstrupr(it8->id); key = BinSrchKey(it8->id); if (key == SNONE) it8->sy = SIDENT; else it8->sy = key; } else /* Is a number? */ if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+') { int sign = 1; if (it8->ch == '-') { sign = -1; NextCh(it8); } it8->inum = 0; it8->sy = SINUM; while (isdigit(it8->ch)) { if ((long) it8->inum * 10L > (long) INT_MAX) { ReadReal(it8, it8->inum); it8->sy = SDNUM; it8->dnum *= sign; return; } it8->inum = it8->inum * 10 + (it8->ch - '0'); NextCh(it8); } if (it8->ch == '.') { ReadReal(it8, it8->inum); it8->sy = SDNUM; it8->dnum *= sign; return; } it8 -> inum *= sign; return; } else switch ((int) it8->ch) { case '\0': case '\x1a': it8->sy = SEOF; break; case '\n': NextCh(it8); it8->sy = SEOLN; it8->lineno++; break; /* Comment */ case '#': NextCh(it8); while (it8->ch && it8->ch != '\n') NextCh(it8); it8->sy = SCOMMENT; break; /* String. I will support \", \n, \t and \\. */ /* But otherwise I hardly doubt these will be used ... */ case '\'': case '\"': idptr = it8->str; sng = it8->ch; k = 0; NextCh(it8); while (k < MAXSTR && it8->ch != sng) { if (it8->ch == '\n'|| it8->ch == '\r') k = MAXSTR+1; else { if (it8->ch == '\\') { NextCh(it8); switch (it8->ch) { case 'n': *idptr++ = '\n'; break; case 'r': *idptr++ = '\r'; break; case 't': *idptr++ = '\t'; break; case '\\': *idptr++ = '\\'; break; default: *idptr++ = (char) it8->ch; } NextCh(it8); } else { *idptr++ = (char) it8->ch; NextCh(it8); } k++; } } it8->sy = SSTRING; *idptr = '\0'; NextCh(it8); break; default: it8->sy = SSYNERROR; NextCh(it8); } } while (it8->sy == SCOMMENT); }