00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "3d/point_light_model.h"
00029 #include "3d/light_trav.h"
00030 #include "3d/root_model.h"
00031 #include "3d/skeleton_model.h"
00032
00033
00034 namespace NL3D {
00035
00036
00037
00038 void CPointLightModel::registerBasic()
00039 {
00040 CMOT::registerModel( PointLightModelId, TransformId, CPointLightModel::creator);
00041 CMOT::registerObs( LightTravId, PointLightModelId, CPointLightModelLightObs::creator );
00042 }
00043
00044
00045 CPointLightModel::CPointLightModel()
00046 {
00047 _DeltaPosToSkeletonWhenOutOfFrustum.set(0, 0, 1.5f);
00048 _TimeFromLastClippedSpotDirection= 0;
00049 }
00050
00051
00052
00053 CPointLightModel::~CPointLightModel()
00054 {
00055 }
00056
00057
00058
00059 void CPointLightModel::initModel()
00060 {
00061 CTransform::initModel();
00062
00063
00064 IObs *obs= getObs(LightTravId);
00065 CLightTrav *lightTrav= (CLightTrav*)obs->Trav;
00066 nlassert( lightTrav->LightModelRoot );
00067
00068 lightTrav->link(lightTrav->LightModelRoot, this);
00069
00070 }
00071
00072
00073
00074 void CPointLightModel::setDeltaPosToSkeletonWhenOutOfFrustum(const CVector &deltaPos)
00075 {
00076 _DeltaPosToSkeletonWhenOutOfFrustum= deltaPos;
00077 }
00078
00079
00080
00081 const CVector &CPointLightModel::getDeltaPosToSkeletonWhenOutOfFrustum() const
00082 {
00083 return _DeltaPosToSkeletonWhenOutOfFrustum;
00084 }
00085
00086
00087
00088 void CPointLightModelLightObs::traverse(IObs *caller)
00089 {
00090 CPointLightModel *plModel= (CPointLightModel*)Model;
00091 CLightTrav *lightTrav= (CLightTrav*)Trav;
00092
00093
00094
00095
00096
00097
00098
00099 plModel->PointLight.resetLightedModels();
00100
00101
00102
00103 if( plModel->isHrcVisible() )
00104 {
00105
00106 if( plModel->isClipVisible() )
00107 {
00108
00109 plModel->PointLight.setPosition( plModel->getWorldMatrix().getPos() );
00110
00111
00112 if(plModel->PointLight.getType() == CPointLight::SpotLight)
00113 {
00114
00115 plModel->_TimeFromLastClippedSpotDirection-= 0.05f;
00116 if(plModel->_TimeFromLastClippedSpotDirection <= 0)
00117 {
00118 plModel->PointLight.setupSpotDirection(plModel->getWorldMatrix().getJ());
00119 }
00120 else
00121 {
00122 CVector actualSpotDir= plModel->getWorldMatrix().getJ();
00123
00124 float t= plModel->_TimeFromLastClippedSpotDirection;
00125 CVector interpSpotDir= actualSpotDir*(1-t) + plModel->_LastWorldSpotDirectionWhenOutOfFrustum * t;
00126
00127 plModel->PointLight.setupSpotDirection(interpSpotDir);
00128 }
00129 }
00130 }
00131 else
00132 {
00133
00134 nlassert(plModel->getHrcObs()->_AncestorSkeletonModel);
00135 const CMatrix &skMatrix= plModel->getHrcObs()->_AncestorSkeletonModel->getWorldMatrix();
00136
00137 plModel->PointLight.setPosition( skMatrix * plModel->_DeltaPosToSkeletonWhenOutOfFrustum );
00138
00139
00140 if(plModel->PointLight.getType() == CPointLight::SpotLight)
00141 {
00142
00143 if(plModel->_TimeFromLastClippedSpotDirection != 1)
00144 {
00145
00146 plModel->_LastWorldSpotDirectionWhenOutOfFrustum= plModel->PointLight.getSpotDirection();
00147
00148 plModel->_TimeFromLastClippedSpotDirection= 1;
00149 }
00150
00151
00152 }
00153 }
00154
00155
00156
00157 lightTrav->LightingManager.addDynamicLight(&plModel->PointLight);
00158 }
00159
00160 }
00161
00162
00163
00164 }