0029528: Visualization, TKOpenGl - allow defining sRGB textures
[occt.git] / src / Vrml / Vrml_SpotLight.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <gp_Vec.hxx>
16 #include <Quantity_Color.hxx>
17 #include <Vrml_SpotLight.hxx>
18
19 Vrml_SpotLight::Vrml_SpotLight():
20   myOnOff(Standard_True),
21   myIntensity(1),
22   myColor (Quantity_NOC_WHITE),
23   myLocation (0, 0, 1),
24   myDirection (0, 0, -1),
25   myDropOffRate(0), 
26   myCutOffAngle(0.785398) 
27 {
28   //
29 }
30
31  Vrml_SpotLight::Vrml_SpotLight( const Standard_Boolean aOnOff, 
32                                  const Standard_Real aIntensity, 
33                                  const Quantity_Color& aColor, 
34                                  const gp_Vec& aLocation,
35                                  const gp_Vec& aDirection,
36                                  const Standard_Real aDropOffRate, 
37                                  const Standard_Real aCutOffAngle) 
38 {
39   myOnOff = aOnOff;
40   if (aIntensity < 0. || aIntensity > 1.)
41     {
42       throw Standard_Failure("Error : Light intensity must be in the range 0.0 to 1.0, inclusive.");
43     }
44   myIntensity = aIntensity;
45   myColor = aColor;
46   myLocation = aLocation;
47   myDirection = aDirection;
48   myDropOffRate = aDropOffRate;
49   myCutOffAngle = aCutOffAngle;
50 }
51
52 void Vrml_SpotLight::SetOnOff(const Standard_Boolean aOnOff)
53 {
54   myOnOff = aOnOff;
55 }
56
57 Standard_Boolean Vrml_SpotLight::OnOff() const 
58 {
59   return myOnOff;
60 }
61
62 void Vrml_SpotLight::SetIntensity(const Standard_Real aIntensity)
63 {
64   if (aIntensity < 0. || aIntensity > 1.)
65     {
66       throw Standard_Failure("Error : Light intensity must be in the range 0.0 to 1.0, inclusive.");
67     }
68   myIntensity = aIntensity;
69 }
70
71 Standard_Real Vrml_SpotLight::Intensity() const 
72 {
73   return myIntensity;
74 }
75
76 void Vrml_SpotLight::SetColor(const Quantity_Color& aColor)
77 {
78   myColor = aColor;
79 }
80
81 Quantity_Color Vrml_SpotLight::Color() const 
82 {
83   return  myColor;
84 }
85
86 void Vrml_SpotLight::SetLocation(const gp_Vec& aLocation)
87 {
88   myLocation = aLocation;
89 }
90
91 gp_Vec Vrml_SpotLight::Location() const 
92 {
93   return myLocation;
94 }
95
96 void Vrml_SpotLight::SetDirection(const gp_Vec& aDirection)
97 {
98   myDirection = aDirection;
99 }
100
101 gp_Vec Vrml_SpotLight::Direction() const 
102 {
103   return myDirection;
104 }
105
106 void Vrml_SpotLight::SetDropOffRate(const Standard_Real aDropOffRate)
107 {
108   myDropOffRate = aDropOffRate;
109 }
110
111 Standard_Real Vrml_SpotLight::DropOffRate() const 
112 {
113   return myDropOffRate;
114 }
115
116 void Vrml_SpotLight::SetCutOffAngle(const Standard_Real aCutOffAngle)
117 {
118   myCutOffAngle = aCutOffAngle;
119 }
120
121 Standard_Real Vrml_SpotLight::CutOffAngle() const 
122 {
123   return myCutOffAngle;
124 }
125
126 Standard_OStream& Vrml_SpotLight::Print(Standard_OStream& anOStream) const 
127 {
128  anOStream  << "SpotLight {\n";
129
130  if ( myOnOff != Standard_True )
131    {
132     anOStream  << "    on\t\tFALSE\n";
133 //    anOStream << myOnOff << "\n";
134    }
135
136  if ( Abs(myIntensity - 1) > 0.0001 )
137    {
138     anOStream  << "    intensity\t";
139     anOStream << myIntensity << "\n";
140    }
141
142  if ( Abs(myColor.Red() - 1) > 0.0001 || 
143      Abs(myColor.Green() - 1) > 0.0001 || 
144      Abs(myColor.Blue() - 1) > 0.0001 )
145    {
146     NCollection_Vec3<Standard_Real> aColor_sRGB;
147     myColor.Values (aColor_sRGB.r(), aColor_sRGB.g(), aColor_sRGB.b(), Quantity_TOC_sRGB);
148     anOStream  << "    color\t";
149     anOStream << aColor_sRGB.r() << " " << aColor_sRGB.g() << " " << aColor_sRGB.b() << "\n";
150    }
151
152  if ( Abs(myLocation.X() - 0) > 0.0001 || 
153      Abs(myLocation.Y() - 0) > 0.0001 || 
154      Abs(myLocation.Z() - 1) > 0.0001 ) 
155    {
156     anOStream  << "    location\t";
157     anOStream << myLocation.X() << " " << myLocation.Y() << " " << myLocation.Z() << "\n";
158    }
159
160  if ( Abs(myDirection.X() - 0) > 0.0001 || 
161      Abs(myDirection.Y() - 0) > 0.0001 || 
162      Abs(myDirection.Z() + 1) > 0.0001 ) 
163    {
164     anOStream  << "    direction\t";
165     anOStream << myDirection.X() << " " << myDirection.Y() << " " << myDirection.Z() << "\n";
166    }
167
168  if ( Abs(myDropOffRate - 0) > 0.0001 )
169    {
170     anOStream  << "    dropOffRate\t";
171     anOStream << myDropOffRate << "\n";
172    }
173
174  if ( Abs(myCutOffAngle - 0.785398) > 0.0000001 )
175    {
176     anOStream  << "    cutOffAngle\t";
177     anOStream << myCutOffAngle << "\n";
178    }
179
180  anOStream  << "}\n";
181  return anOStream;
182 }