Einzelnen Beitrag anzeigen

TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#1

[DirectX] Dynamisch X-Meshs rendern

  Alt 11. Okt 2008, 12:01
Hallo DP,
ich versuche gerade verschieden viele Meshs in eine Szene zu rendern. Dafür habe ich es jetzt schon einmal mit folgendem Code (es ist eine Komponente) probiert:
Code:
public IntPtr    RenderControl;
public String[]  XFiles;
private Device    device;
private Mesh      m_Mesh;
private Material[] m_MeshMaterials;
private Texture[] m_MeshTextures;
private Vector3    v_CurrMeshPos = new Vector3();
public int       Height = 700;
public int       Width = 300;

public bool InitializeGraphics()
{
    PresentParameters pres = new PresentParameters();
    pres.Windowed = true;
    pres.SwapEffect = SwapEffect.Discard;

    device = new Device(0, DeviceType.Hardware,
                        RenderControl, CreateFlags.SoftwareVertexProcessing, pres);

    LoadMesh("MeinMesh.x");

    return true;
}

public void Render()
{
    device.Clear(ClearFlags.Target, Color.Silver, 1.0F, 0);
    device.BeginScene();


    InitializeCamera();
    InitializeLights();

    DrawMesh(v_CurrMeshPos);


    device.EndScene();
    device.Present();
}


public void DisposeGraphics()
{
    device.Dispose();
}

private void InitializeCamera()
{
    Vector3 cameraPos = new Vector3(0, 0, -150f);
    Vector3 cameraTarget = new Vector3();
    Vector3 cameraUp = new Vector3(0, 1, 0);

    device.Transform.View = Matrix.LookAtLH(cameraPos, cameraTarget, cameraUp);
             
    float fov = (float) Math.PI / 4;
    float aspectRatio = Width / Height;
    float zNear = 1;
    float zFar = 1000;
             
    device.Transform.Projection = Matrix.PerspectiveFovLH(fov, aspectRatio, zNear, zFar);
}

private void InitializeLights()
{
    device.RenderState.Lighting = false;
    device.RenderState.Ambient = Color.White;
}

private void DrawMesh(Vector3 v3Position)
{
    device.Transform.World = Matrix.Translation(v3Position);

    for (int i = 0; i < m_MeshMaterials.Length; i++)
    {
        device.Material = m_MeshMaterials[i];
        device.SetTexture(0, m_MeshTextures[i]);
        m_Mesh.DrawSubset(i);
    }
}

public void LoadMesh(string file)
{
    ExtendedMaterial[] mtrl;
    GraphicsStream adj;

    m_Mesh = Mesh.FromFile(file, MeshFlags.Managed, device, out adj, out mtrl);

    if ((mtrl != null) && (mtrl.Length > 0))
    {
        m_MeshMaterials = new Material[mtrl.Length];
        m_MeshTextures = new Texture[mtrl.Length];

        for (int i = 0; i < mtrl.Length; i++)
        {
            m_MeshMaterials[i] = mtrl[i].Material3D;

            if ((mtrl[i].TextureFilename != null) && (mtrl[i].TextureFilename != string.Empty))
            {
                m_MeshTextures[i] = TextureLoader.FromFile(device, directory + mtrl[i].TextureFilename);
            }
         }
    }
}
Allerings wird das Objekt nicht angezeigt Wie schaffe ich jetzt, dass das Objekt angezeigt wird, und wie schaffe ich das jetzt, mehrere Objekte anzeigen zu lassen? Die x-Dateien sollen im Array XFiles liegen und beim hinzufügen/entfernen dementsprechend der Szene hinzugefügt/entfernt werden.
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat