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< vertexcounti++) 
    {
        // 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() ); 
}