D3DXVECTOR3 SC_pos(1,2,3); // Position des SC
void create_shadow_matrix(D3DXMATRIX* out, D3DXPLANE* plane, D3DXMATRIX* to_world)
{
// creates eine Shadow-Matrix, die ein Objekt auf eine Plane mappt
// to_world ist eine Objekt-Matrix, die die Position des OC in der Game-Welt beschreibt.
D3DXMATRIX shm;
D3DXVECTOR4 lightpos(SC_pos.x, SC_pos.y, SC_pos.z, 1.0f);
D3DXMatrixShadow(&shm, &lightpos, plane);
D3DXMatrixMultiply(out, to_world, &shm);
}
void MESH::render_flat_shadow(D3DXMATRIX* shadow_matrix, DWORD shadow_color)
{
// renders das Objekt nur mit Vertexcolors in einen dynamischen Vertexbuffer
// shadow_color ist die Farbe des Shadows, empfohlen: shadow_color= D3DCOLOR_RGBA(0,0,0, 50);
// die Funktion benutzt OriginalCode aus meiner Engine. Ich hoffe, es wird trotzdem deutlich,
// was hier passiert.
// Damit es klappt, müssen gesetzt sein:
/*
D3D_RENDERER::me()->set_renderstate(D3DRS_ZENABLE, TRUE);
D3D_RENDERER::me()->set_renderstate(D3DRS_ZWRITEENABLE, TRUE);
D3D_RENDERER::me()->set_renderstate(D3DRS_ALPHABLENDENABLE, TRUE);
D3D_RENDERER::me()->set_renderstate(D3DRS_ALPHATESTENABLE, TRUE);
*/
// ENGINE-INTERN: setze Weltmatrix im Renderer
D3D_RENDERER::me()->set_worldmatrix(shadow_matrix);
// ENGINE-INTERN: hol VB des Meshes (ist eine eigene Struktur für einen statischen VB)
int vertexcount= vb.get_vertexcount();
// ENGINE-INTERN:
// VERTEX_1= D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1
// hole ein Zeiger auf die Vertices des Meshes:
VERTEX_1* myvert= (VERTEX_1*) vb.get_sw_buffer()->get_buffer();
// ENGINE-INTERN:
// finde den dynamischen Vertexbuffer, der für VERTEX_3 (D3DFVF_XYZ | D3DFVF_DIFFUSE) verwendet wird:
VERTEXBUFFER_DYN* dynvb= D3D_RENDERER::me()->get_res_manager()->get_vb_dyn(VERTEX_3::vinfo.vformat,
vertexcount);
// VERTEX_3= (D3DFVF_XYZ | D3DFVF_DIFFUSE)
VERTEX_3* vert;
dynvb->lock(vertexcount, (BYTE**) &vert);
for (int i= 0; i< vertexcount; i++)
{
// kopiere die Geometrie des Meshes in den Vertexbuffer und weise den Vertices die
// gewünschte Farbe zu:
vert[i].pos= myvert[i].pos;
vert[i].diff= shadow_color;
}
dynvb->unlock();
// ENGINE-INTERN:
// benutze zum rendern den Indexbuffer des Meshes
dynvb->render_indexed(&ib, 0, ib.get_trianglecount() );
}
|