Ejemplo n.º 1
0
	//------------------------------------------------------------------------------
	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;
	}
Ejemplo n.º 2
0
	//------------------------------------------------------------------------------
	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;
	}
Ejemplo n.º 3
0
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 );
}
Ejemplo n.º 4
0
	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 );
	}
Ejemplo n.º 5
0
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;
}