non-aggregates error

Started by
7 comments, last by stece 16 years, 4 months ago
Dear all I want to create a rotating solid figure and I changed SDK 4-th tutorial ( about lights) to something like this:

#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 ) // disable deprecated warning 
#include <strsafe.h>
#pragma warning( default : 4996 ) 




//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices

// A structure for our custom vertex type. We added a normal, and omitted the
// color (which is provided by the material)
struct CUSTOMVERTEX
{
    D3DXVECTOR3 position; // The 3D position for the vertex
    D3DXVECTOR3 normal;   // The surface normal for the vertex
};

// Our custom FVF, which describes our custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)




//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Initializes Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    // Create the D3D object.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    // Set up the structure used to create the D3DDevice. Since we are now
    // using more complex geometry, we will create a device with a zbuffer.
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    // Create the D3DDevice
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    // Turn off culling
    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

    // Turn on the zbuffer
    g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: InitGeometry()
// Desc: Creates the scene geometry
//-----------------------------------------------------------------------------
HRESULT InitGeometry()
{
	D3DXVECTOR3 vect[]= {
		{ 1.0f, 1.0f, 1.0f, },
		{ 0.0f, 1.0f, 1.0f, },
		{ 1.0f, 0.0f, 1.0f, },
		{ 1.0f, 1.0f, 0.0f, },
	};
    // Create the vertex buffer.
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

    
    CUSTOMVERTEX* pVertices;
    if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    for( DWORD i=0; i<5; i++ )
    {
		pVertices.position = vect;
			pVertices.normal = vect;
        
    }
    g_pVB->Unlock();

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: Releases all previously initialized objects
//-----------------------------------------------------------------------------
VOID Cleanup()
{
    if( g_pVB != NULL )
        g_pVB->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();
}



//-----------------------------------------------------------------------------
// Name: SetupMatrices()
// Desc: Sets up the world, view, and projection transform matrices.
//-----------------------------------------------------------------------------
VOID SetupMatrices()
{
    // Set up world matrix
    D3DXMATRIXA16 matWorld;
    D3DXMatrixIdentity( &matWorld );
    D3DXMatrixRotationX( &matWorld, timeGetTime()/500.0f );
    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

    // Set up our view matrix. A view matrix can be defined given an eye point,
    // a point to lookat, and a direction for which way is up. Here, we set the
    // eye five units back along the z-axis and up three units, look at the
    // origin, and define "up" to be in the y-direction.
    D3DXVECTOR3 vEyePt( 0.0f, 2.0f,-5.0f );
    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    D3DXMATRIXA16 matView;
    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    // For the projection matrix, we set up a perspective transform (which
    // transforms geometry from 3D view space to 2D viewport space, with
    // a perspective divide making objects smaller in the distance). To build
    // a perpsective transform, we need the field of view (1/4 pi is common),
    // the aspect ratio, and the near and far clipping planes (which define at
    // what distances geometry should be no longer be rendered).
    D3DXMATRIXA16 matProj;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}




//-----------------------------------------------------------------------------
// Name: SetupLights()
// Desc: Sets up the lights and materials for the scene.
//-----------------------------------------------------------------------------
VOID SetupLights()
{
    // Set up a material. The material here just has the diffuse and ambient
    // colors set to yellow. Note that only one material can be used at a time.
    D3DMATERIAL9 mtrl;
    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
    mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
    mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
    mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
    mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
    g_pd3dDevice->SetMaterial( &mtrl );

    // Set up a white, directional light, with an oscillating direction.
    // Note that many lights may be active at a time (but each one slows down
    // the rendering of our scene). However, here we are just using one. Also,
    // we need to set the D3DRS_LIGHTING renderstate to enable lighting
    D3DXVECTOR3 vecDir;
    D3DLIGHT9 light;
    ZeroMemory( &light, sizeof(D3DLIGHT9) );
    light.Type       = D3DLIGHT_DIRECTIONAL;
    light.Diffuse.r  = 1.0f;
    light.Diffuse.g  = 1.0f;
    light.Diffuse.b  = 1.0f;
    vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f),
                         1.0f,
                         sinf(timeGetTime()/350.0f) );
    D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
    light.Range       = 1000.0f;
    g_pd3dDevice->SetLight( 0, &light );
    g_pd3dDevice->LightEnable( 0, TRUE );
    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

    // Finally, turn on some ambient light.
    g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
}




//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Draws the scene
//-----------------------------------------------------------------------------
VOID Render()
{
    // Clear the backbuffer and the zbuffer
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                         D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Setup the lights and materials
        SetupLights();

        // Setup the world, view, and projection matrices
        SetupMatrices();

        // Render the vertex buffer contents
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4 );

        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}




//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The window's message handler
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}




//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      L"D3D Tutorial", NULL };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 04: Lights",
                              WS_OVERLAPPEDWINDOW, 0, 0, 1000, 780,
                              NULL, NULL, wc.hInstance, NULL );

    // Initialize Direct3D
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Create the geometry
        if( SUCCEEDED( InitGeometry() ) )
        {
            // Show the window
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

            // Enter the message loop
            MSG msg;
            ZeroMemory( &msg, sizeof(msg) );
            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    Render();
            }
        }
    }

    UnregisterClass( L"D3D Tutorial", wc.hInstance );
    return 0;
}


I have a problem with InitGeometry function. I want to assign untransformed x,y,z coordinates to my pVertices( vertex buffer variable) using D3DXVECTOR3 array to create the solid figure and I get "non-aggregate" error which I don't understand. Is there my thinking correct? Could somebody please help me please? Thank you in advance.
Advertisement
What line causes the error?
You're filling in 5 vertices, but you've only allocated space for 4 in the VB and the array you're copying from, but I don't know if that's what's causing the error.

What is the exact error? Is it a compile error, or a runtime error? And are you using the Debug Runtimes?
My code is like this:
#include <Windows.h>#include <mmsystem.h>#include <d3dx9.h>#pragma warning( disable : 4996 ) // disable deprecated warning #include <strsafe.h>#pragma warning( default : 4996 ) //-----------------------------------------------------------------------------// Global variables//-----------------------------------------------------------------------------LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDeviceLPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering deviceLPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices// A structure for our custom vertex type. We added a normal, and omitted the// color (which is provided by the material)struct CUSTOMVERTEX{    D3DXVECTOR3 position; // The 3D position for the vertex    D3DXVECTOR3 normal;   // The surface normal for the vertex};// Our custom FVF, which describes our custom vertex structure#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//-----------------------------------------------------------------------------// Name: InitD3D()// Desc: Initializes Direct3D//-----------------------------------------------------------------------------HRESULT InitD3D( HWND hWnd ){    // Create the D3D object.    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )        return E_FAIL;    // Set up the structure used to create the D3DDevice. Since we are now    // using more complex geometry, we will create a device with a zbuffer.    D3DPRESENT_PARAMETERS d3dpp;    ZeroMemory( &d3dpp, sizeof(d3dpp) );    d3dpp.Windowed = TRUE;    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    d3dpp.EnableAutoDepthStencil = TRUE;    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;    // Create the D3DDevice    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,                                      &d3dpp, &g_pd3dDevice ) ) )    {        return E_FAIL;    }    // Turn off culling    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );    // Turn on the zbuffer    g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );    return S_OK;}//-----------------------------------------------------------------------------// Name: InitGeometry()// Desc: Creates the scene geometry//-----------------------------------------------------------------------------HRESULT InitGeometry(){	D3DXVECTOR3 vect[]= {		{ 1.0f, 1.0f, 1.0f, },		{ 0.0f, 1.0f, 1.0f, },		{ 1.0f, 0.0f, 1.0f, },		{ 1.0f, 1.0f, 0.0f, },	};    // Create the vertex buffer.    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),                                                  0, D3DFVF_CUSTOMVERTEX,                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )    {        return E_FAIL;    }        CUSTOMVERTEX* pVertices;    if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )        return E_FAIL;    for( DWORD i=0; i<4; i++ )    {		pVertices.position = vect;			pVertices.normal = vect;            }    g_pVB->Unlock();    return S_OK;}//-----------------------------------------------------------------------------// Name: Cleanup()// Desc: Releases all previously initialized objects//-----------------------------------------------------------------------------VOID Cleanup(){    if( g_pVB != NULL )        g_pVB->Release();    if( g_pd3dDevice != NULL )        g_pd3dDevice->Release();    if( g_pD3D != NULL )        g_pD3D->Release();}//-----------------------------------------------------------------------------// Name: SetupMatrices()// Desc: Sets up the world, view, and projection transform matrices.//-----------------------------------------------------------------------------VOID SetupMatrices(){    // Set up world matrix    D3DXMATRIXA16 matWorld;    D3DXMatrixIdentity( &matWorld );    D3DXMatrixRotationX( &matWorld, timeGetTime()/500.0f );    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );    // Set up our view matrix. A view matrix can be defined given an eye point,    // a point to lookat, and a direction for which way is up. Here, we set the    // eye five units back along the z-axis and up three units, look at the    // origin, and define "up" to be in the y-direction.    D3DXVECTOR3 vEyePt( 0.0f, 2.0f,-5.0f );    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );    D3DXMATRIXA16 matView;    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );    // For the projection matrix, we set up a perspective transform (which    // transforms geometry from 3D view space to 2D viewport space, with    // a perspective divide making objects smaller in the distance). To build    // a perpsective transform, we need the field of view (1/4 pi is common),    // the aspect ratio, and the near and far clipping planes (which define at    // what distances geometry should be no longer be rendered).    D3DXMATRIXA16 matProj;    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );}//-----------------------------------------------------------------------------// Name: SetupLights()// Desc: Sets up the lights and materials for the scene.//-----------------------------------------------------------------------------VOID SetupLights(){    // Set up a material. The material here just has the diffuse and ambient    // colors set to yellow. Note that only one material can be used at a time.    D3DMATERIAL9 mtrl;    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );    mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;    mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;    mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;    mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;    g_pd3dDevice->SetMaterial( &mtrl );    // Set up a white, directional light, with an oscillating direction.    // Note that many lights may be active at a time (but each one slows down    // the rendering of our scene). However, here we are just using one. Also,    // we need to set the D3DRS_LIGHTING renderstate to enable lighting    D3DXVECTOR3 vecDir;    D3DLIGHT9 light;    ZeroMemory( &light, sizeof(D3DLIGHT9) );    light.Type       = D3DLIGHT_DIRECTIONAL;    light.Diffuse.r  = 1.0f;    light.Diffuse.g  = 1.0f;    light.Diffuse.b  = 1.0f;    vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f),                         1.0f,                         sinf(timeGetTime()/350.0f) );    D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );    light.Range       = 1000.0f;    g_pd3dDevice->SetLight( 0, &light );    g_pd3dDevice->LightEnable( 0, TRUE );    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );    // Finally, turn on some ambient light.    g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );}//-----------------------------------------------------------------------------// Name: Render()// Desc: Draws the scene//-----------------------------------------------------------------------------VOID Render(){    // Clear the backbuffer and the zbuffer    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,                         D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );    // Begin the scene    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )    {        // Setup the lights and materials        SetupLights();        // Setup the world, view, and projection matrices        SetupMatrices();        // Render the vertex buffer contents        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4 );        // End the scene        g_pd3dDevice->EndScene();    }    // Present the backbuffer contents to the display    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------------------------------------------// Name: MsgProc()// Desc: The window's message handler//-----------------------------------------------------------------------------LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){    switch( msg )    {        case WM_DESTROY:            Cleanup();            PostQuitMessage( 0 );            return 0;    }    return DefWindowProc( hWnd, msg, wParam, lParam );}//-----------------------------------------------------------------------------// Name: WinMain()// Desc: The application's entry point//-----------------------------------------------------------------------------INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ){    // Register the window class    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,                      L"D3D Tutorial", NULL };    RegisterClassEx( &wc );    // Create the application's window    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 04: Lights",                              WS_OVERLAPPEDWINDOW, 0, 0, 1000, 780,                              NULL, NULL, wc.hInstance, NULL );    // Initialize Direct3D    if( SUCCEEDED( InitD3D( hWnd ) ) )    {        // Create the geometry        if( SUCCEEDED( InitGeometry() ) )        {            // Show the window            ShowWindow( hWnd, SW_SHOWDEFAULT );            UpdateWindow( hWnd );            // Enter the message loop            MSG msg;            ZeroMemory( &msg, sizeof(msg) );            while( msg.message!=WM_QUIT )            {                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )                {                    TranslateMessage( &msg );                    DispatchMessage( &msg );                }                else                    Render();            }        }    }    UnregisterClass( L"D3D Tutorial", wc.hInstance );    return 0;}


and error is like this:
1>Compiling...
1>mojlight.cpp
1>c:\documents and settings\noname\pulpit\c++\mojlight\mojlight\mojlight.cpp(79) : error C2552: 'vect' : non-aggregates cannot be initialized with initializer list
1> 'D3DXVECTOR3' : Types with a base are not aggregate
1>c:\documents and settings\noname\pulpit\c++\mojlight\mojlight\mojlight.cpp(80) : error C2552: 'vect' : non-aggregates cannot be initialized with initializer list
1> 'D3DXVECTOR3' : Types with a base are not aggregate
1>c:\documents and settings\noname\pulpit\c++\mojlight\mojlight\mojlight.cpp(81) : error C2552: 'vect' : non-aggregates cannot be initialized with initializer list
1> 'D3DXVECTOR3' : Types with a base are not aggregate
1>c:\documents and settings\noname\pulpit\c++\mojlight\mojlight\mojlight.cpp(82) : error C2552: 'vect' : non-aggregates cannot be initialized with initializer list
1> 'D3DXVECTOR3' : Types with a base are not aggregate
1>Build log was saved at "file://c:\Documents and Settings\noname\Pulpit\c++\mojlight\mojlight\Debug\BuildLog.htm"
1>mojlight - 4 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
It's a compile error
Thank you in advance.
Compiler Error C2552. D3DXVECTOR3 has a constructor, it's not an aggregate. Change this:
D3DXVECTOR3 vect[]= {	{ 1.0f, 1.0f, 1.0f, },	{ 0.0f, 1.0f, 1.0f, },	{ 1.0f, 0.0f, 1.0f, },	{ 1.0f, 1.0f, 0.0f, },};

To this:
D3DXVECTOR3 vect[]= {	D3DXVECTOR3( 1.0f, 1.0f, 1.0f ),	D3DXVECTOR3( 0.0f, 1.0f, 1.0f ),	D3DXVECTOR3( 1.0f, 0.0f, 1.0f ),	D3DXVECTOR3( 1.0f, 1.0f, 0.0f )};
I.e. call the constructor instead of trying to initialise data directly.
Thank you for helping me.
My code is like this now :

#include <Windows.h>#include <mmsystem.h>#include <d3dx9.h>#pragma warning( disable : 4996 ) // disable deprecated warning #include <strsafe.h>#pragma warning( default : 4996 ) //-----------------------------------------------------------------------------// Global variables//-----------------------------------------------------------------------------LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDeviceLPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering deviceLPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices// A structure for our custom vertex type. We added a normal, and omitted the// color (which is provided by the material)struct CUSTOMVERTEX{    D3DXVECTOR3 position; // The 3D position for the vertex    D3DXVECTOR3 normal;   // The surface normal for the vertex};// Our custom FVF, which describes our custom vertex structure#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//-----------------------------------------------------------------------------// Name: InitD3D()// Desc: Initializes Direct3D//-----------------------------------------------------------------------------HRESULT InitD3D( HWND hWnd ){    // Create the D3D object.    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )        return E_FAIL;    // Set up the structure used to create the D3DDevice. Since we are now    // using more complex geometry, we will create a device with a zbuffer.    D3DPRESENT_PARAMETERS d3dpp;    ZeroMemory( &d3dpp, sizeof(d3dpp) );    d3dpp.Windowed = TRUE;    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    d3dpp.EnableAutoDepthStencil = TRUE;    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;    // Create the D3DDevice    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,                                      &d3dpp, &g_pd3dDevice ) ) )    {        return E_FAIL;    }    // Turn off culling    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );    // Turn on the zbuffer    g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );    return S_OK;}//-----------------------------------------------------------------------------// Name: InitGeometry()// Desc: Creates the scene geometry//-----------------------------------------------------------------------------HRESULT InitGeometry(){	D3DXVECTOR3 vect[]= {	D3DXVECTOR3( 1.0f, 1.0f, 1.0f ),	D3DXVECTOR3( 0.0f, 1.0f, 1.0f ),	D3DXVECTOR3( 1.0f, 0.0f, 1.0f ),	D3DXVECTOR3( 1.0f, 1.0f, 0.0f )};    // Create the vertex buffer.    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),                                                  0, D3DFVF_CUSTOMVERTEX,                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )    {        return E_FAIL;    }        CUSTOMVERTEX* pVertices;    if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )        return E_FAIL;    for( DWORD i=0; i<4; i++ )    {		pVertices.position = vect;			pVertices.normal = vect;            }    g_pVB->Unlock();    return S_OK;}//-----------------------------------------------------------------------------// Name: Cleanup()// Desc: Releases all previously initialized objects//-----------------------------------------------------------------------------VOID Cleanup(){    if( g_pVB != NULL )        g_pVB->Release();    if( g_pd3dDevice != NULL )        g_pd3dDevice->Release();    if( g_pD3D != NULL )        g_pD3D->Release();}//-----------------------------------------------------------------------------// Name: SetupMatrices()// Desc: Sets up the world, view, and projection transform matrices.//-----------------------------------------------------------------------------VOID SetupMatrices(){    // Set up world matrix    D3DXMATRIXA16 matWorld;    D3DXMatrixIdentity( &matWorld );    D3DXMatrixRotationX( &matWorld, timeGetTime()/500.0f );    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );    // Set up our view matrix. A view matrix can be defined given an eye point,    // a point to lookat, and a direction for which way is up. Here, we set the    // eye five units back along the z-axis and up three units, look at the    // origin, and define "up" to be in the y-direction.    D3DXVECTOR3 vEyePt( 0.0f, 2.0f,-5.0f );    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );    D3DXMATRIXA16 matView;    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );    // For the projection matrix, we set up a perspective transform (which    // transforms geometry from 3D view space to 2D viewport space, with    // a perspective divide making objects smaller in the distance). To build    // a perpsective transform, we need the field of view (1/4 pi is common),    // the aspect ratio, and the near and far clipping planes (which define at    // what distances geometry should be no longer be rendered).    D3DXMATRIXA16 matProj;    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );}//-----------------------------------------------------------------------------// Name: SetupLights()// Desc: Sets up the lights and materials for the scene.//-----------------------------------------------------------------------------VOID SetupLights(){    // Set up a material. The material here just has the diffuse and ambient    // colors set to yellow. Note that only one material can be used at a time.    D3DMATERIAL9 mtrl;    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );    mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;    mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;    mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;    mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;    g_pd3dDevice->SetMaterial( &mtrl );    // Set up a white, directional light, with an oscillating direction.    // Note that many lights may be active at a time (but each one slows down    // the rendering of our scene). However, here we are just using one. Also,    // we need to set the D3DRS_LIGHTING renderstate to enable lighting    D3DXVECTOR3 vecDir;    D3DLIGHT9 light;    ZeroMemory( &light, sizeof(D3DLIGHT9) );    light.Type       = D3DLIGHT_DIRECTIONAL;    light.Diffuse.r  = 1.0f;    light.Diffuse.g  = 1.0f;    light.Diffuse.b  = 1.0f;    vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f),                         1.0f,                         sinf(timeGetTime()/350.0f) );    D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );    light.Range       = 1000.0f;    g_pd3dDevice->SetLight( 0, &light );    g_pd3dDevice->LightEnable( 0, TRUE );    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );    // Finally, turn on some ambient light.    g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );}//-----------------------------------------------------------------------------// Name: Render()// Desc: Draws the scene//-----------------------------------------------------------------------------VOID Render(){    // Clear the backbuffer and the zbuffer    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,                         D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );    // Begin the scene    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )    {        // Setup the lights and materials        SetupLights();        // Setup the world, view, and projection matrices        SetupMatrices();        // Render the vertex buffer contents        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 4 );        // End the scene        g_pd3dDevice->EndScene();    }    // Present the backbuffer contents to the display    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------------------------------------------// Name: MsgProc()// Desc: The window's message handler//-----------------------------------------------------------------------------LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){    switch( msg )    {        case WM_DESTROY:            Cleanup();            PostQuitMessage( 0 );            return 0;    }    return DefWindowProc( hWnd, msg, wParam, lParam );}//-----------------------------------------------------------------------------// Name: WinMain()// Desc: The application's entry point//-----------------------------------------------------------------------------INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ){    // Register the window class    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,                      L"D3D Tutorial", NULL };    RegisterClassEx( &wc );    // Create the application's window    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 04: Lights",                              WS_OVERLAPPEDWINDOW, 0, 0, 1000, 780,                              NULL, NULL, wc.hInstance, NULL );    // Initialize Direct3D    if( SUCCEEDED( InitD3D( hWnd ) ) )    {        // Create the geometry        if( SUCCEEDED( InitGeometry() ) )        {            // Show the window            ShowWindow( hWnd, SW_SHOWDEFAULT );            UpdateWindow( hWnd );            // Enter the message loop            MSG msg;            ZeroMemory( &msg, sizeof(msg) );            while( msg.message!=WM_QUIT )            {                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )                {                    TranslateMessage( &msg );                    DispatchMessage( &msg );                }                else                    Render();            }        }    }    UnregisterClass( L"D3D Tutorial", wc.hInstance );    return 0;}

There are no debug errors but I can't get my figure.I want to assign untransformed x,y,z coordinates to my pVertices( vertex buffer variable) using D3DXVECTOR3 array to create a figure.
Could somebody look at this code please? Why the thing I get is a blue screen only? I'm not sure about InitGeometry function because there I made a change from the original SDK Tutorial code.
I advancely appreciate Your help.
A few of notes:

1) The last parameter to DrawPrimitive() is the number of primitives to render, not the number of vertices. You have two triangles, so it should be 2.

2) You are using the vertex positions as normals, but these positions are not unit length vectors. Even worse, they're not pointing away from the triangles, which is probably why you get a blank screen. You'll need to create proper normals for lighting to work.
1. That's right. There have to be 2 triangles in the DrawPrimitive method. But I don't understand it because if there are 4 points in the space one can draw 4 triangles or at least three of them and the 4-th one is created by the three existing ones. So how to make nontransparent pyramid from my 4 points in space?
2 I'll think about normals later, because it has started working. There is a piece of pyramid I wanted to get.

My question is how to draw a full pyramid having 4 points in space.
Here I include my present code:

#include <Windows.h>#include <mmsystem.h>#include <d3dx9.h>#pragma warning( disable : 4996 ) // disable deprecated warning #include <strsafe.h>#pragma warning( default : 4996 ) //-----------------------------------------------------------------------------// Global variables//-----------------------------------------------------------------------------LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDeviceLPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering deviceLPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL; // Buffer to hold vertices// A structure for our custom vertex type. We added a normal, and omitted the// color (which is provided by the material)struct CUSTOMVERTEX{    D3DXVECTOR3 position; // The 3D position for the vertex    D3DXVECTOR3 normal;   // The surface normal for the vertex};// Our custom FVF, which describes our custom vertex structure#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//-----------------------------------------------------------------------------// Name: InitD3D()// Desc: Initializes Direct3D//-----------------------------------------------------------------------------HRESULT InitD3D( HWND hWnd ){    // Create the D3D object.    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )        return E_FAIL;    // Set up the structure used to create the D3DDevice. Since we are now    // using more complex geometry, we will create a device with a zbuffer.    D3DPRESENT_PARAMETERS d3dpp;    ZeroMemory( &d3dpp, sizeof(d3dpp) );    d3dpp.Windowed = TRUE;    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;    d3dpp.EnableAutoDepthStencil = TRUE;    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;    // Create the D3DDevice    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,                                      &d3dpp, &g_pd3dDevice ) ) )    {        return E_FAIL;    }    // Turn off culling    g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );    // Turn on the zbuffer    g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );    return S_OK;}//-----------------------------------------------------------------------------// Name: InitGeometry()// Desc: Creates the scene geometry//-----------------------------------------------------------------------------HRESULT InitGeometry(){	D3DXVECTOR3 vect[]= {	D3DXVECTOR3( 1.0f, 1.0f, 1.0f ),	D3DXVECTOR3( 0.0f, 1.0f, 1.0f ),	D3DXVECTOR3( 1.0f, 0.0f, 1.0f ),	D3DXVECTOR3( 1.0f, 1.0f, 0.0f )};    // Create the vertex buffer.    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),                                                  0, D3DFVF_CUSTOMVERTEX,                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )    {        return E_FAIL;    }        CUSTOMVERTEX* pVertices;    if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )        return E_FAIL;    for( DWORD i=0; i<4; i++ )    {		pVertices.position = vect;			pVertices.normal = vect;            }    g_pVB->Unlock();    return S_OK;}//-----------------------------------------------------------------------------// Name: Cleanup()// Desc: Releases all previously initialized objects//-----------------------------------------------------------------------------VOID Cleanup(){    if( g_pVB != NULL )        g_pVB->Release();    if( g_pd3dDevice != NULL )        g_pd3dDevice->Release();    if( g_pD3D != NULL )        g_pD3D->Release();}//-----------------------------------------------------------------------------// Name: SetupMatrices()// Desc: Sets up the world, view, and projection transform matrices.//-----------------------------------------------------------------------------VOID SetupMatrices(){    // Set up world matrix    D3DXMATRIXA16 matWorld;    D3DXMatrixIdentity( &matWorld );    D3DXMatrixRotationX( &matWorld, timeGetTime()/500.0f );    g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );    // Set up our view matrix. A view matrix can be defined given an eye point,    // a point to lookat, and a direction for which way is up. Here, we set the    // eye five units back along the z-axis and up three units, look at the    // origin, and define "up" to be in the y-direction.    D3DXVECTOR3 vEyePt( 0.0f, 2.0f,-5.0f );    D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );    D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );    D3DXMATRIXA16 matView;    D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );    // For the projection matrix, we set up a perspective transform (which    // transforms geometry from 3D view space to 2D viewport space, with    // a perspective divide making objects smaller in the distance). To build    // a perpsective transform, we need the field of view (1/4 pi is common),    // the aspect ratio, and the near and far clipping planes (which define at    // what distances geometry should be no longer be rendered).    D3DXMATRIXA16 matProj;    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );}//-----------------------------------------------------------------------------// Name: SetupLights()// Desc: Sets up the lights and materials for the scene.//-----------------------------------------------------------------------------VOID SetupLights(){    // Set up a material. The material here just has the diffuse and ambient    // colors set to yellow. Note that only one material can be used at a time.    D3DMATERIAL9 mtrl;    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );    mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;    mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;    mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;    mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;    g_pd3dDevice->SetMaterial( &mtrl );    // Set up a white, directional light, with an oscillating direction.    // Note that many lights may be active at a time (but each one slows down    // the rendering of our scene). However, here we are just using one. Also,    // we need to set the D3DRS_LIGHTING renderstate to enable lighting    D3DXVECTOR3 vecDir;    D3DLIGHT9 light;    ZeroMemory( &light, sizeof(D3DLIGHT9) );    light.Type       = D3DLIGHT_DIRECTIONAL;    light.Diffuse.r  = 1.0f;    light.Diffuse.g  = 1.0f;    light.Diffuse.b  = 1.0f;    vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f),                         1.0f,                         sinf(timeGetTime()/350.0f) );    D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );    light.Range       = 1000.0f;    g_pd3dDevice->SetLight( 0, &light );    g_pd3dDevice->LightEnable( 0, TRUE );    g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );    // Finally, turn on some ambient light.    g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );}//-----------------------------------------------------------------------------// Name: Render()// Desc: Draws the scene//-----------------------------------------------------------------------------VOID Render(){    // Clear the backbuffer and the zbuffer    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,                         D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );    // Begin the scene    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )    {        // Setup the lights and materials        SetupLights();        // Setup the world, view, and projection matrices        SetupMatrices();        // Render the vertex buffer contents        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );        // End the scene        g_pd3dDevice->EndScene();    }    // Present the backbuffer contents to the display    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );}//-----------------------------------------------------------------------------// Name: MsgProc()// Desc: The window's message handler//-----------------------------------------------------------------------------LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ){    switch( msg )    {        case WM_DESTROY:            Cleanup();            PostQuitMessage( 0 );            return 0;    }    return DefWindowProc( hWnd, msg, wParam, lParam );}//-----------------------------------------------------------------------------// Name: WinMain()// Desc: The application's entry point//-----------------------------------------------------------------------------INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ){    // Register the window class    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,                      L"D3D Tutorial", NULL };    RegisterClassEx( &wc );    // Create the application's window    HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 04: Lights",                              WS_OVERLAPPEDWINDOW, 0, 0, 1000, 780,                              NULL, NULL, wc.hInstance, NULL );    // Initialize Direct3D    if( SUCCEEDED( InitD3D( hWnd ) ) )    {        // Create the geometry        if( SUCCEEDED( InitGeometry() ) )        {            // Show the window            ShowWindow( hWnd, SW_SHOWDEFAULT );            UpdateWindow( hWnd );            // Enter the message loop            MSG msg;            ZeroMemory( &msg, sizeof(msg) );            while( msg.message!=WM_QUIT )            {                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )                {                    TranslateMessage( &msg );                    DispatchMessage( &msg );                }                else                    Render();            }        }    }    UnregisterClass( L"D3D Tutorial", wc.hInstance );    return 0;}


Again, I modified InitGeometry function and DrawPrimitives method, from the original SDK Tutorial sample.
Thank you in advance.
Dear people
Thank you for your help I'd like to finish this exercise on my own. If somebody wishes then can write something but I consider my problem solved. If I have any more questions I'll start a new thread.
Thank you again

This topic is closed to new replies.

Advertisement