Changeset 9376
- Timestamp:
- 12/17/08 12:00:16 (4 years ago)
- Location:
- OpenSceneGraph/trunk
- Files:
-
- 18 modified
-
include/osg/GraphicsContext (modified) (1 diff)
-
include/osgAnimation/Sampler (modified) (1 diff)
-
include/osgIntrospection/ConstructorInfo (modified) (4 diffs)
-
include/osgIntrospection/MethodInfo (modified) (5 diffs)
-
include/osgIntrospection/PropertyInfo (modified) (5 diffs)
-
include/osgShadow/MinimalDrawBoundsShadowMap (modified) (1 diff)
-
src/osg/Camera.cpp (modified) (1 diff)
-
src/osg/OcclusionQueryNode.cpp (modified) (1 diff)
-
src/osgIntrospection/ConstructorInfo.cpp (modified) (1 diff)
-
src/osgIntrospection/MethodInfo.cpp (modified) (2 diffs)
-
src/osgIntrospection/PropertyInfo.cpp (modified) (17 diffs)
-
src/osgShadow/ConvexPolyhedron.cpp (modified) (4 diffs)
-
src/osgShadow/DebugShadowMap.cpp (modified) (7 diffs)
-
src/osgShadow/MinimalCullBoundsShadowMap.cpp (modified) (2 diffs)
-
src/osgShadow/MinimalDrawBoundsShadowMap.cpp (modified) (1 diff)
-
src/osgTerrain/Layer.cpp (modified) (1 diff)
-
src/osgText/Font.cpp (modified) (1 diff)
-
src/osgText/String.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
OpenSceneGraph/trunk/include/osg/GraphicsContext
r9363 r9376 159 159 width(0), 160 160 height(0), 161 colorDepth(0),162 refreshRate(0)161 refreshRate(0), 162 colorDepth(0) 163 163 {} 164 164 ScreenSettings(int width, int height, double refreshRate=0, unsigned int colorDepth=0) : 165 165 width(width), 166 166 height(height), 167 colorDepth(colorDepth),168 refreshRate(refreshRate)167 refreshRate(refreshRate), 168 colorDepth(colorDepth) 169 169 {} 170 170 -
OpenSceneGraph/trunk/include/osgAnimation/Sampler
r9093 r9376 120 120 typedef TemplateSampler<Vec4CubicBezierInterpolator> Vec4CubicBezierSampler; 121 121 122 } ;122 } 123 123 124 124 #endif -
OpenSceneGraph/trunk/include/osgIntrospection/ConstructorInfo
r6155 r9376 28 28 public: 29 29 // Standard constructor. 30 ConstructorInfo(const Type& decl type, const ParameterInfoList& params, std::string briefHelp = std::string(), std::string detailedHelp = std::string())31 : _decl type(decltype),30 ConstructorInfo(const Type& declaratiionType, const ParameterInfoList& params, std::string briefHelp = std::string(), std::string detailedHelp = std::string()) 31 : _declarationType(declaratiionType), 32 32 _params(params), 33 33 _explicit(false), … … 38 38 39 39 // Constructor allowing explicit state specification. 40 ConstructorInfo(const Type& decl type, const ParameterInfoList& params, bool isExplicit, std::string briefHelp = std::string(), std::string detailedHelp = std::string())41 : _decl type(decltype),40 ConstructorInfo(const Type& declaratiionType, const ParameterInfoList& params, bool isExplicit, std::string briefHelp = std::string(), std::string detailedHelp = std::string()) 41 : _declarationType(declaratiionType), 42 42 _params(params), 43 43 _explicit(isExplicit), … … 69 69 inline const Type& getDeclaringType() const 70 70 { 71 return _decl type;71 return _declarationType; 72 72 } 73 73 … … 93 93 94 94 private: 95 const Type& _decl type;95 const Type& _declarationType; 96 96 ParameterInfoList _params; 97 97 bool _explicit; -
OpenSceneGraph/trunk/include/osgIntrospection/MethodInfo
r6155 r9376 47 47 48 48 /// Direct initialization constructor. 49 inline MethodInfo(const std::string& qname, const Type& decl type, const Type& rtype, const ParameterInfoList& plist, VirtualState virtualState, std::string briefHelp = std::string(), std::string detailedHelp = std::string());49 inline MethodInfo(const std::string& qname, const Type& declarationType, const Type& rtype, const ParameterInfoList& plist, VirtualState virtualState, std::string briefHelp = std::string(), std::string detailedHelp = std::string()); 50 50 51 51 /// Direct initialization constructor for static functions (no virtual specifier). 52 inline MethodInfo(const std::string& qname, const Type& decl type, const Type& rtype, const ParameterInfoList& plist, std::string briefHelp = std::string(), std::string detailedHelp = std::string());52 inline MethodInfo(const std::string& qname, const Type& declarationType, const Type& rtype, const ParameterInfoList& plist, std::string briefHelp = std::string(), std::string detailedHelp = std::string()); 53 53 54 54 /// Destructor … … 120 120 121 121 std::string _name; 122 const Type& _decl type;122 const Type& _declarationType; 123 123 const Type& _rtype; 124 124 ParameterInfoList _params; … … 131 131 // INLINE METHODS 132 132 133 inline MethodInfo::MethodInfo(const std::string& qname, const Type& decl type, const Type& rtype, const ParameterInfoList& plist, VirtualState virtualState, std::string briefHelp, std::string detailedHelp)133 inline MethodInfo::MethodInfo(const std::string& qname, const Type& declarationType, const Type& rtype, const ParameterInfoList& plist, VirtualState virtualState, std::string briefHelp, std::string detailedHelp) 134 134 : CustomAttributeProvider(), 135 _decl type(decltype),135 _declarationType(declarationType), 136 136 _rtype(rtype), 137 137 _params(plist), … … 143 143 } 144 144 145 inline MethodInfo::MethodInfo(const std::string& qname, const Type& decl type, const Type& rtype, const ParameterInfoList& plist, std::string briefHelp, std::string detailedHelp)145 inline MethodInfo::MethodInfo(const std::string& qname, const Type& declarationType, const Type& rtype, const ParameterInfoList& plist, std::string briefHelp, std::string detailedHelp) 146 146 : CustomAttributeProvider(), 147 _decl type(decltype),147 _declarationType(declarationType), 148 148 _rtype(rtype), 149 149 _params(plist), … … 170 170 inline const Type& MethodInfo::getDeclaringType() const 171 171 { 172 return _decl type;172 return _declarationType; 173 173 } 174 174 -
OpenSceneGraph/trunk/include/osgIntrospection/PropertyInfo
r7885 r9376 57 57 /// user is expected to add a custom accessor attribute to this 58 58 /// PropertyInfo object. 59 PropertyInfo(const Type& decl type, const Type& ptype, const std::string& name, const MethodInfo* getm, const MethodInfo* setm, std::string briefHelp = std::string(), std::string detailedHelp = std::string())59 PropertyInfo(const Type& declaratiionType, const Type& ptype, const std::string& name, const MethodInfo* getm, const MethodInfo* setm, std::string briefHelp = std::string(), std::string detailedHelp = std::string()) 60 60 : CustomAttributeProvider(), 61 _decl type(decltype),61 _declarationType(declaratiionType), 62 62 _ptype(ptype), 63 63 _name(name), … … 79 79 /// type of the property's value, the property name and the 80 80 /// getter/setter/counter/adder/insert/remover methods. 81 PropertyInfo(const Type& decl type, const Type& ptype, const std::string& name, const MethodInfo* getm, const MethodInfo* setm, const MethodInfo* numm, const MethodInfo* addm, const MethodInfo* insm, const MethodInfo* remm, std::string briefHelp = std::string(), std::string detailedHelp = std::string())81 PropertyInfo(const Type& declaratiionType, const Type& ptype, const std::string& name, const MethodInfo* getm, const MethodInfo* setm, const MethodInfo* numm, const MethodInfo* addm, const MethodInfo* insm, const MethodInfo* remm, std::string briefHelp = std::string(), std::string detailedHelp = std::string()) 82 82 : CustomAttributeProvider(), 83 _decl type(decltype),83 _declarationType(declaratiionType), 84 84 _ptype(ptype), 85 85 _name(name), … … 106 106 /// to be indexed. The same is true if the getter is null and the 107 107 /// setter has more than one parameter. 108 PropertyInfo(const Type& decl type, const Type& ptype, const std::string& name, const MethodInfo* getm, const MethodInfo* setm, const MethodInfo* remm, std::string briefHelp = std::string(), std::string detailedHelp = std::string())108 PropertyInfo(const Type& declaratiionType, const Type& ptype, const std::string& name, const MethodInfo* getm, const MethodInfo* setm, const MethodInfo* remm, std::string briefHelp = std::string(), std::string detailedHelp = std::string()) 109 109 : CustomAttributeProvider(), 110 _decl type(decltype),110 _declarationType(declaratiionType), 111 111 _ptype(ptype), 112 112 _name(name), … … 162 162 inline virtual const Type& getDeclaringType() const 163 163 { 164 return _decl type;164 return _declarationType; 165 165 } 166 166 … … 361 361 362 362 private: 363 const Type& _decl type;363 const Type& _declarationType; 364 364 const Type& _ptype; 365 365 std::string _name; -
OpenSceneGraph/trunk/include/osgShadow/MinimalDrawBoundsShadowMap
r9113 r9376 119 119 120 120 protected: 121 osg::observer_ptr< ViewData > _vd; 121 122 osg::ref_ptr< osg::NodeCallback > _nc; 122 osg::observer_ptr< ViewData > _vd;123 123 }; 124 124 }; -
OpenSceneGraph/trunk/src/osg/Camera.cpp
r9239 r9376 286 286 } 287 287 break; 288 default: 289 break; 288 290 } 289 291 _bufferAttachmentMap[buffer]._internalFormat = internalFormat; -
OpenSceneGraph/trunk/src/osg/OcclusionQueryNode.cpp
r8974 r9376 597 597 OpenThreads::ScopedLock<OpenThreads::Mutex> lock( _frameCountMutex ); 598 598 int& lastQueryFrame = _frameCountMap[ camera ]; 599 if ( issueQuery = (curFrame - lastQueryFrame >= _queryFrameCount) ) 599 issueQuery = (curFrame - lastQueryFrame >= _queryFrameCount); 600 if (issueQuery) 600 601 lastQueryFrame = curFrame; 601 602 } -
OpenSceneGraph/trunk/src/osgIntrospection/ConstructorInfo.cpp
r5328 r9376 19 19 void ConstructorInfo::getInheritedProviders(CustomAttributeProviderList& providers) const 20 20 { 21 for (int i=0; i<_decl type.getNumBaseTypes(); ++i)21 for (int i=0; i<_declarationType.getNumBaseTypes(); ++i) 22 22 { 23 const ConstructorInfo* ci = _decl type.getBaseType(i).getConstructor(_params);23 const ConstructorInfo* ci = _declarationType.getBaseType(i).getConstructor(_params); 24 24 if (ci) 25 25 { -
OpenSceneGraph/trunk/src/osgIntrospection/MethodInfo.cpp
r5328 r9376 19 19 void MethodInfo::getInheritedProviders(CustomAttributeProviderList& providers) const 20 20 { 21 for (int i=0; i<_decl type.getNumBaseTypes(); ++i)21 for (int i=0; i<_declarationType.getNumBaseTypes(); ++i) 22 22 { 23 const MethodInfo* mi = _decl type.getBaseType(i).getMethod(_name, _params, false);23 const MethodInfo* mi = _declarationType.getBaseType(i).getMethod(_name, _params, false); 24 24 if (mi) 25 25 { … … 32 32 { 33 33 if (isConst() != other->isConst()) return false; 34 if (_decl type != other->_decltype) return false;34 if (_declarationType != other->_declarationType) return false; 35 35 if (_rtype != other->_rtype) return false; 36 36 if (_name != other->_name) return false; -
OpenSceneGraph/trunk/src/osgIntrospection/PropertyInfo.cpp
r5655 r9376 21 21 void PropertyInfo::getInheritedProviders(CustomAttributeProviderList& providers) const 22 22 { 23 for (int i=0; i<_decl type.getNumBaseTypes(); ++i)24 { 25 const PropertyInfo* pi = _decl type.getBaseType(i).getProperty(_name, _ptype, getIndexParameters(), false);23 for (int i=0; i<_declarationType.getNumBaseTypes(); ++i) 24 { 25 const PropertyInfo* pi = _declarationType.getBaseType(i).getProperty(_name, _ptype, getIndexParameters(), false); 26 26 if (pi) 27 27 { … … 44 44 45 45 if (!_getm) 46 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::GET);46 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::GET); 47 47 48 48 if (pta) … … 64 64 65 65 if (!_getm) 66 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::GET);66 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::GET); 67 67 68 68 if (pta) … … 82 82 83 83 if (!_setm) 84 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::SET);84 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::SET); 85 85 86 86 ValueList args; … … 102 102 103 103 if (!_getm) 104 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::IGET);104 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::IGET); 105 105 106 106 if (pta) … … 122 122 123 123 if (!_getm) 124 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::IGET);124 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::IGET); 125 125 126 126 if (pta) … … 139 139 140 140 if (!_setm) 141 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::ISET);141 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::ISET); 142 142 143 143 ValueList tmpArgs(args); … … 152 152 153 153 if (!_numm) 154 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::COUNT);154 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::COUNT); 155 155 156 156 return variant_cast<int>(_numm->invoke(instance)); … … 170 170 171 171 if (!_getm) 172 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::AGET);172 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::AGET); 173 173 174 174 ValueList args; … … 193 193 194 194 if (!_getm) 195 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::AGET);195 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::AGET); 196 196 197 197 ValueList args; … … 213 213 214 214 if (!_setm) 215 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::ASET);215 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::ASET); 216 216 217 217 ValueList args; … … 231 231 232 232 if (!_addm) 233 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::ADD);233 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::ADD); 234 234 235 235 ValueList args; … … 248 248 249 249 if (!_addm) 250 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::INSERT);250 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::INSERT); 251 251 252 252 ValueList args; … … 266 266 267 267 if (!_remm) 268 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::REMOVE);268 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::REMOVE); 269 269 270 270 ValueList args; … … 290 290 } 291 291 292 if (_decl type.isAbstract())292 if (_declarationType.isAbstract()) 293 293 { 294 294 if (_ptype.isAbstract() || !_ptype.isDefined()) … … 298 298 299 299 // auto default value 300 Value instance = _decl type.createInstance();300 Value instance = _declarationType.createInstance(); 301 301 return getValue(instance); 302 302 } … … 361 361 362 362 if (!_remm) 363 throw PropertyAccessException(_decl type.getQualifiedName() + "::" + _name, PropertyAccessException::REMOVE);363 throw PropertyAccessException(_declarationType.getQualifiedName() + "::" + _name, PropertyAccessException::REMOVE); 364 364 365 365 _remm->invoke(instance, args); -
OpenSceneGraph/trunk/src/osgShadow/ConvexPolyhedron.cpp
r9343 r9376 996 996 osg::Vec3d vc = face.vertices[(i+2)%face.vertices.size()]; 997 997 998 999 #if ( CONVEX_POLYHEDRON_WARN_ON_INCOHERENT_DATA > 1 || CONVEX_POLYHEDRON_WARN_ON_CONCAVE_POLYGON ) 998 1000 double dist = fabs( face.plane.distance( va ) ); 999 1000 #if ( CONVEX_POLYHEDRON_WARN_ON_INCOHERENT_DATA > 1 || CONVEX_POLYHEDRON_WARN_ON_CONCAVE_POLYGON )1001 1001 if( dist > 0.0001 ) 1002 1002 { … … 1026 1026 return 0; 1027 1027 1028 if( negative + colinear == face.vertices.size() )1028 if( (negative + colinear) == static_cast<int>(face.vertices.size()) ) 1029 1029 return -( negative + colinear ); 1030 1030 1031 if( positive + colinear == face.vertices.size() )1031 if( (positive + colinear) == static_cast<int>(face.vertices.size()) ) 1032 1032 return +( positive + colinear ); 1033 1033 … … 1600 1600 #endif 1601 1601 //Select orthogonal faces and vertices appropriate for offseting 1602 if( dotOffset0 == 0.0 && dotOffset1 < 0.0||1603 dotOffset1 == 0.0 && dotOffset0 < 0.0)1602 if( (dotOffset0 == 0.0 && dotOffset1 < 0.0) || 1603 (dotOffset1 == 0.0 && dotOffset0 < 0.0) ) 1604 1604 { 1605 1605 Face * face = ( dotOffset0 == 0 ? edgeFaces[0] : edgeFaces[1] ); … … 1607 1607 } 1608 1608 1609 if( dotOffset0 < 0.0 && dotOffset1 > 0.0||1610 dotOffset1 < 0.0 && dotOffset0 > 0.0)1609 if( (dotOffset0 < 0.0 && dotOffset1 > 0.0) || 1610 (dotOffset1 < 0.0 && dotOffset0 > 0.0) ) 1611 1611 { 1612 1612 Face & face = createFace(); -
OpenSceneGraph/trunk/src/osgShadow/DebugShadowMap.cpp
r8989 r9376 37 37 DebugShadowMap::DebugShadowMap(): 38 38 BaseClass(), 39 _doDebugDraw( false ),40 39 _hudSize( 2, 2 ), 41 40 _hudOrigin( -1, -1 ), … … 43 42 _viewportOrigin( DEFAULT_DEBUG_HUD_ORIGIN_X, DEFAULT_DEBUG_HUD_ORIGIN_Y ), 44 43 _orthoSize( 2, 2 ), 45 _orthoOrigin( -1, -1 ) 44 _orthoOrigin( -1, -1 ), 45 _doDebugDraw( false ) 46 46 { 47 47 … … 105 105 (const DebugShadowMap& copy, const osg::CopyOp& copyop) : 106 106 BaseClass(copy,copyop), 107 _doDebugDraw( copy._doDebugDraw ),108 107 _hudSize( copy._hudSize ), 109 108 _hudOrigin( copy._hudOrigin ), … … 111 110 _viewportOrigin( copy._viewportOrigin ), 112 111 _orthoSize( copy._viewportOrigin ), 113 _orthoOrigin( copy._viewportOrigin ) 112 _orthoOrigin( copy._viewportOrigin ), 113 _doDebugDraw( copy._doDebugDraw ) 114 114 { 115 115 if( copy._depthColorFragmentShader.valid() ) … … 227 227 if( &polytope == NULL ) { // delete 228 228 PolytopeGeometry & pg = _polytopeGeometryMap[ std::string( name ) ]; 229 for( int i = 0; i < VECTOR_LENGTH( pg._geometry ) ; i++ )229 for( unsigned int i = 0; i < VECTOR_LENGTH( pg._geometry ) ; i++ ) 230 230 { 231 231 if( pg._geometry[i].valid() ) { … … 247 247 pg._colorInside = colorInside; 248 248 249 for( int i = 0; i < VECTOR_LENGTH( pg._geometry ) ; i++ )249 for( unsigned int i = 0; i < VECTOR_LENGTH( pg._geometry ) ; i++ ) 250 250 { 251 251 if( !pg._geometry[i].valid() ) { … … 275 275 const int num = 2; // = VECTOR_LENGTH( PolytopeGeometry::_geometry ); 276 276 277 const osg::Camera *camera[2] = { viewCam, shadowCam };278 279 277 osg::Matrix 280 278 transform[ num ] = -
OpenSceneGraph/trunk/src/osgShadow/MinimalCullBoundsShadowMap.cpp
r8984 r9376 137 137 return !b || 138 138 a->_projection < b->_projection || 139 a->_projection == b->_projection && a->_modelview < b->_modelview;139 (a->_projection == b->_projection && a->_modelview < b->_modelview); 140 140 } 141 141 }; … … 314 314 osg::ref_ptr< osg::RefMatrix > modelview; 315 315 osg::ref_ptr< osg::RefMatrix > projection; 316 osg::Matrix viewToWorld, modelToWorld, *ptrProjection = NULL, 317 *ptrViewToWorld = &projectionToWorld, *ptrModelToWorld; 316 osg::Matrix viewToWorld, modelToWorld, 317 *ptrProjection = NULL, 318 *ptrViewToWorld = &projectionToWorld, 319 *ptrModelToWorld = NULL; 318 320 319 321 // compute bounding boxes but skip old ones (placed at the end as NULLs) -
OpenSceneGraph/trunk/src/osgShadow/MinimalDrawBoundsShadowMap.cpp
r8989 r9376 149 149 unsigned char * pb = (unsigned char *)image->data(); 150 150 151 float scale = 1.f / 254 , bias = 0.5f;151 float scale = 1.f / 254; 152 152 for( int y = 0; y < image->t(); y++ ) { 153 153 float fY = ( 0.5f + y ) / image->t(); -
OpenSceneGraph/trunk/src/osgTerrain/Layer.cpp
r9037 r9376 572 572 { 573 573 if (_implementation.valid()) _implementation->setModifiedCount(value); 574 } ;574 } 575 575 576 576 unsigned int ProxyLayer::getModifiedCount() const -
OpenSceneGraph/trunk/src/osgText/Font.cpp
r9343 r9376 667 667 668 668 if (s_renderer && 669 ( strstr((const char*)s_renderer,"Radeon")!=0) ||669 ((strstr((const char*)s_renderer,"Radeon")!=0) || 670 670 (strstr((const char*)s_renderer,"RADEON")!=0) || 671 (strstr((const char*)s_renderer,"ALL-IN-WONDER")!=0)) 671 (strstr((const char*)s_renderer,"ALL-IN-WONDER")!=0))) 672 672 { 673 673 // we're running on an ATI, so need to work around its -
OpenSceneGraph/trunk/src/osgText/String.cpp
r7648 r9376 305 305 { 306 306 utf8string+=(char)(0xc0 | (currentChar>>6)); 307 utf8string+=(char)(0x80 | currentChar & 0x3f);307 utf8string+=(char)(0x80 | (currentChar & 0x3f)); 308 308 } 309 309 else 310 310 { 311 311 utf8string+=(char)(0xe0 | (currentChar>>12)); 312 utf8string+=(char)(0x80 | ( currentChar>>6) & 0x3f);313 utf8string+=(char)(0x80 | currentChar & 0x3f);312 utf8string+=(char)(0x80 | ((currentChar>>6) & 0x3f)); 313 utf8string+=(char)(0x80 | (currentChar & 0x3f)); 314 314 } 315 315 }
