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"); }
// 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) ); }