//------------------------------------------------------------------------------ CColor4 CStaticIlluminator::SpotLighting( const sMaterial& material, const CVector3f& position, const CVector3f& normal ) { CColor4 color = CColor4::Black; for (vector<CLight>::iterator it = this->spotLights.begin(); it != this->spotLights.end(); ++it) { CLight& light = *it; LightStruct &tLight = *(light.GetLightStruct()); CVector3f direction = tLight.Position - position; float distance = direction.Mag(); if (tLight.Range < distance) continue; direction.Normalize(); float NdotL = direction.Dot(normal); NdotL = max(NdotL, 0.0f); float attenuation = 1.0f / (tLight.Attenuation0 + tLight.Attenuation1 * distance + tLight.Attenuation2 * distance * distance); // spot tLight factor float cosAlpha = (-direction).Dot(tLight.Direction); float cosHalfPhi = cos(tLight.Phi * 0.5f); if (cosAlpha <= cosHalfPhi) continue; float cosHalfTheta = cos(tLight.Theta * 0.5f); float intensity = (cosAlpha - cosHalfPhi) / (cosHalfTheta - cosHalfPhi); intensity = pow(intensity, tLight.Falloff); color += tLight.Diffuse * material.Diffuse * NdotL * attenuation * intensity; } return color; }
//------------------------------------------------------------------------------ CColor4 CStaticIlluminator::PointLighting( const sMaterial& material, const CVector3f& position, const CVector3f& normal ) { CColor4 color = CColor4::Black; for (vector<CLight>::iterator it = this->pointLights.begin(); it != this->pointLights.end(); ++it) { CLight& light = *it; CVector3f direction = light.GetPosition() - position; float distance = direction.Mag(); if (light.GetRange() < distance) continue; direction.Normalize(); float NdotL = direction.Dot(normal); NdotL = max(NdotL, 0.0f); LightStruct &tLight = *(light.GetLightStruct()); float attenuation = 1.0f / (tLight.Attenuation0 + tLight.Attenuation1 * distance + tLight.Attenuation2 * distance * distance); color += tLight.Diffuse * material.Diffuse * NdotL * attenuation; } return color; }
int CEditModel::CalSkeletalSize(int nDelta) { if( GetAnimateGroup() && GetSketetalFrame() && GetSketetalFrame()->GetSkeletalNum() == 0 ) return 0; if(m_SkeletalPos) delete[] m_SkeletalPos; m_SkeletalPos = new SkeletalPos[ GetSketetalFrame()->GetSkeletalNum() ]; CEditAnimate* Ani = (CEditAnimate*)GetAnimateGroup()->GetAniById( 0 ); m_Size += m_Size*0.1f*nDelta; if( !nDelta ) { m_Size = 0.0f; UINT count = m_RenderMatrix.GetSkeletalCount(); for( UINT i = 0; i < count; i++ ) { const CKeyFrames* KeyFrames = Ani->GetKeyFrame( i ); if( KeyFrames->IsFrameExist() ) { CQuaternion Quat; CVector3f Tran; KeyFrames->GetFirst(Quat,Tran,0.0f); float len = Tran.Mag(); m_Size = max( m_Size, len); m_Size = min( 200, m_Size ); } } } return CalAniSize( *(CEditSkeletal*)&GetSketetalFrame()->GetRootSkeletal(), *Ani, m_Size*3.0f ); }
void CAnimCamera::Rotate( float yaw, float pitch ) { m_pCamEx->rotateY(yaw); m_pCamEx->pitch(pitch); CVector3f vecPos = m_pCamEx->getPosition(); CVector3f vecTarget = m_pCamEx->getTargetPosition(); CVector3f vecLen = vecTarget - vecPos; float fLen = vecLen.Mag(); CVector3f vecDir = m_pCamEx->getDIRECTION() * fLen; vecDir = vecPos + vecDir; DebugOut("%f, %f, %f\n", vecDir.x, vecDir.y, vecDir.z ); SetTarget( vecDir ); }
int CEditModel::CalAniSize(const CEditSkeletal& Skeletal, CEditAnimate& Animate, float Size) { int i,j,pos=0; CVector3f child[256]; float len=0; BYTE SID = Skeletal.GetSkeletalID(); if( SID && Skeletal.GetChildNum() ) { for( i = 0; i < (int)Skeletal.GetChildNum(); i++ ) { BYTE ID = Skeletal.GetChild(i)->GetSkeletalID(); CQuaternion Quat; CVector3f Tran; Animate.GetKeyFrame( ID )->GetFirst(Quat,Tran,0.0f); CVector3f off = Tran; len = max( off.Mag(), len ); for( j = 0; j < pos; j++ ) { if( child[j] == off ) break; } if( j == pos ) { child[pos] = off; pos++; } } if( pos == 1 )//代表只有一个子骨骼 { m_SkeletalPos[SID].m_Scale = sqr::CVector3f(Size*0.1f+child[0].y,child[0].x,Size*0.1f+child[0].z); } else { float p1[3]={ 0, 0, 0 }; float p2[3]={ 0, 0, 0 }; for( i=0; i<pos; i++ ) { if( child[i].x>p2[0] ) p2[0] = child[i].x; if( child[i].y>p2[1] ) p2[1] = child[i].y; if( child[i].z>p2[2] ) p2[2] = child[i].z; if( child[i].x<p1[0] ) p1[0] = child[i].x; if( child[i].y<p1[1] ) p1[1] = child[i].y; if( child[i].z<p1[2] ) p1[2] = child[i].z; } float height = abs(p1[2]-p2[2]); float width = abs(p1[0]-p2[0]); float length = abs(p1[1]-p2[1]); m_SkeletalPos[SID].m_Scale = sqr::CVector3f(width,height,length); } } else { float s = Size*0.1f; m_SkeletalPos[SID].m_Scale = sqr::CVector3f(s,4.0f,s); } //for( i = 0; i<6; i++ ) //{ // m_SkeletalPos[SID].m_SklPos[i].np = m_SkeletalPos[SID].m_SklPos[i].p.Normalize(); //} for( i = 0; i < (int)Skeletal.GetChildNum(); i++ ) CalAniSize( *(CEditSkeletal*)Skeletal.GetChild(i), Animate, Size ); return 0; }