示例#1
0
void RSObject::CreateShadowTexture()
{
#define EFFECTIVE_SIZE	0.99f
#define SHADOW_COLOR	0xa0a0a0

	rtexture rt;
	rt.New(256,256,RTEXTUREFORMAT_24);
	rt.Fill(0xffffff);

	rmatrix44 tm;

	int i,j,k;
	float f_max=m_BoundingSphereRadiusXY;

	tm=ScaleMatrix44(128.0f*EFFECTIVE_SIZE/f_max)
		*ViewMatrix44(rvector(0,0,0),rvector(1,2,-1),rvector(0,1,0))
		*TranslateMatrix44(128,128,0);

	for(i=0;i<nMesh;i++)
	{
		CMesh *mesh=meshes+i;
		for(j=0;j<mesh->nFaces;j++)
		{
			CFaces *faces=mesh->faceshead+j;
			for(k=0;k<faces->ni;k+=3)
			{
				rvector a=TransformVector(*(rvector*)(&faces->tnlvertices[faces->indicies[k]].x),tm);
				rvector b=TransformVector(*(rvector*)(&faces->tnlvertices[faces->indicies[k+1]].x),tm);
				rvector c=TransformVector(*(rvector*)(&faces->tnlvertices[faces->indicies[k+2]].x),tm);
#define CHECK(x) _ASSERT((x>=0)&&(x<256))

				rt.FillTriangle(a.x,a.y,b.x,b.y,c.x,c.y,SHADOW_COLOR);
				CHECK(a.x);CHECK(a.y);
				CHECK(b.x);CHECK(b.y);
				CHECK(c.x);CHECK(c.y);
			}
		}
	}

	rtexture newrt1;newrt1.CreateAsHalf(&rt);		// 128
	rtexture newrt2;newrt2.CreateAsHalf(&newrt1);	// 64

	newrt2.FillBoundary(0xffffff);
	newrt2.SaveAsBMP("testtest.bmp");

	m_hShadowTexture=RSCreateTexture(
		newrt2.GetWidth(),newrt2.GetHeight(),
		(char*)newrt2.GetData(),NULL,true,"Object:ShadowTexture");
}
示例#2
0
// Return a "lookat" matrix44 given the current camera position (vector3),
//   camera-up vector3, and camera-target vector3.
matrix44 LookAtMatrix44(const vector3 &camPos, const vector3 &target, 
    const vector3 &camUp ) 
{
  matrix44 ret;

  vector3 F = target - camPos;
  F.normalize();

  vector3 S = CrossProduct(F, Normalized(camUp));
  S.normalize();

  vector3 U = CrossProduct(S, F);
  U.normalize();

  ret[0][0] = S.x;
  ret[1][0] = S.y;
  ret[2][0] = S.z;
  ret[3][0] = 0.0;

  ret[0][1] = U.x;
  ret[1][1] = U.y;
  ret[2][1] = U.z;
  ret[3][1] = 0.0;

  ret[0][2] = -F.x;
  ret[1][2] = -F.y;
  ret[2][2] = -F.z;
  ret[3][2] = 0.0;

  ret[0][3] = 0.0F;
  ret[1][3] = 0.0F;
  ret[2][3] = 0.0F;
  ret[3][3] = 1.0F;

  ret *= TranslateMatrix44(-camPos.x, -camPos.y, -camPos.z);

  return ret;
}
	const matrix44 GetTransform(const AABB &aabb){
		return TranslateMatrix44( GetCenter(aabb) )*ScaleMatrix44( GetDim(aabb) );
	}