00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "light.h"
00027 #include <kerosin/renderserver/renderserver.h>
00028 #include <kerosin/openglserver/openglserver.h>
00029 #include <zeitgeist/logserver/logserver.h>
00030
00031
00032
00033
00034
00035
00036
00037 using namespace boost;
00038 using namespace kerosin;
00039 using namespace salt;
00040
00041 Light::Light()
00042 : mDiffuse(1.0f,1.0f,1.0f,1.0f),
00043 mAmbient(0.0f,0.0f,0.0f,1.0f),
00044 mSpecular(1.0f,1.0f,1.0f,1.0f),
00045 mGLLight(-1),
00046 mVP(0),
00047 mFP(0),
00048 mCacheFlushed(true)
00049 {
00050 }
00051
00052 float Light::GetRadius() const
00053 {
00054 return mRadius;
00055 }
00056
00057 void Light::SetRadius(float radius)
00058 {
00059 mRadius = radius;
00060 FlushCache();
00061 }
00062
00063 void Light::SetAmbient(const RGBA& ambient)
00064 {
00065 mAmbient = ambient;
00066 }
00067
00068 const RGBA& Light::GetAmbient()
00069 {
00070 return mAmbient;
00071 }
00072
00073 void Light::SetDiffuse(const RGBA& diffuse)
00074 {
00075 mDiffuse = diffuse;
00076 }
00077
00078 const RGBA& Light::GetDiffuse()
00079 {
00080 return mDiffuse;
00081 }
00082
00083 void Light::SetSpecular(const RGBA& specular)
00084 {
00085 mSpecular = specular;
00086 }
00087
00088 const RGBA& Light::GetSpecular()
00089 {
00090 return mSpecular;
00091 }
00092
00093 void Light::Prepare()
00094 {
00095 if (mGLLight < 0)
00096 {
00097
00098 return;
00099 }
00100
00101 const Vector3f& pos = GetWorldTransform().Pos();
00102
00103 float light_pos[4];
00104 light_pos[0]=pos[0];
00105 light_pos[1]=pos[1];
00106 light_pos[2]=pos[2];
00107 light_pos[3]=1.0f;
00108
00109 glLightfv(mGLLight, GL_AMBIENT, mAmbient);
00110 glLightfv(mGLLight, GL_DIFFUSE, mDiffuse);
00111 glLightfv(mGLLight, GL_POSITION,light_pos);
00112 glEnable(mGLLight);
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 }
00126
00127 void Light::RenderLitMesh(boost::shared_ptr<StaticMesh> )
00128 {
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 }
00158
00159 void Light::FlushCache()
00160 {
00161 const unsigned int n = mCachedIndices.size();
00162 for (unsigned int i=0; i<n; ++i)
00163 {
00164 mCachedIndices[i].Flush();
00165 }
00166 mCacheFlushed = true;
00167 }
00168
00169 void Light::ComputeBoundingBox()
00170 {
00171 mLocalBoundingBox.minVec.Set(-mRadius,-mRadius,-mRadius);
00172 mLocalBoundingBox.maxVec.Set(mRadius,mRadius,mRadius);
00173 }
00174
00175 void Light::OnLink()
00176 {
00177 mOpenGLServer = shared_dynamic_cast<OpenGLServer>
00178 (GetCore()->Get("sys/server/opengl"));
00179
00180 if (mOpenGLServer.get() == 0)
00181 {
00182 GetLog()->Error()
00183 << "(Light) ERROR: OpenGLServer not found\n";
00184 } else
00185 {
00186 mGLLight = mOpenGLServer->AllocLight();
00187
00188 if (mGLLight < 0)
00189 {
00190 GetLog()->Error()
00191 << "(Light) ERROR: No more OpenGL lights available\n";
00192 }
00193
00194 #if 0
00195 mVP = mOpenGLServer->LoadARBVertexProgram("sys/program/omnilight.vp");
00196 if (mVP == 0)
00197 {
00198 GetLog()->Error()
00199 << "(Light) ERROR: Could not load vertex program\n";
00200 }
00201
00202 mFP = mOpenGLServer->LoadARBFragmentProgram("sys/program/omnilight.fp");
00203 if (mFP == 0)
00204 {
00205 GetLog()->Error()
00206 << "(Light) ERROR: Could not load fragment program\n";
00207 }
00208 #endif
00209
00210 }
00211
00212 }
00213
00214 void Light::OnUnlink()
00215 {
00216 if (
00217 (mOpenGLServer.get() != 0) &&
00218 (mGLLight >= 0)
00219 )
00220 {
00221 mOpenGLServer->PutLight(mGLLight);
00222 mGLLight = -1;
00223 }
00224
00225 mOpenGLServer.reset();
00226 }
00227
00228 void Light::DeterminePotentiallyLitTriangles(boost::shared_ptr<StaticMesh>& , std::vector<unsigned int>& )
00229 {
00230
00231
00232
00233
00234
00235
00236
00237 }