Sign in to follow this  
WhoCares357

Arrays & Custom Verteces?

Recommended Posts

I just started directX with the official tutorial. [url=http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B4.aspx]This[/url] is where I got to so far. I was trying to change the shape/colors during runtime but I ran into some trouble. I used the last example on the page (http://www.directxtutorial.com/Tutorial9/B-Direct3DBasics/dx9B4.aspx) as a template and just added to that. I wasn't exactly sure how to change the shape/colors during runtime but I eventually tried just recreating the whole triangle for each new frame. It worked fine when I did it the first time (to test it). However, I had to come up with a less tedious way to do it. So I modified the original init_graphics function to use arrays for the variants of points/colors. Here is the code so far.
// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

// define the screen resolution and keyboard macros
#define SCREEN_WIDTH  1024
#define SCREEN_HEIGHT 768
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")

// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 t_buffer = NULL;    // the pointer to the vertex buffer

float locationA[2];
float locationB[2];
float locationC[2];
DWORD triangleColors[3];

// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(D3DCOLOR R, D3DCOLOR G, D3DCOLOR B); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory
void init_graphics(float locA[], float locB[], float locC[], DWORD color[]); // 3D declarations

struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{

	D3DCOLOR G, B;

	int i = 0;
	
	G = 50;
	B = 100;

	locationA[0] = 300.0;
	locationA[1] = 50.0;
	locationB[0] = 500.0;
	locationB[1] = 200.0;
	locationC[0] = 100.0;
	locationC[1] = 200.0;
	triangleColors[0] = 255;
	triangleColors[1] = 255;
	triangleColors[2] = 255;

    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    // wc.hbrBackground = (HBRUSH)COLOR_WINDOW;    // not needed any more
    wc.lpszClassName = L"WindowClass";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          L"WindowClass",
                          L"Our Direct3D Program",
                          WS_EX_TOPMOST | WS_POPUP,    // fullscreen values
                          0, 0,    // the starting x and y positions should be 0
                          SCREEN_WIDTH, SCREEN_HEIGHT,    // set the window to 640 x 480
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    // set up and initialize Direct3D
    initD3D(hWnd);

    // enter the main loop:

    MSG msg;

    while(TRUE)
    {
        DWORD starting_point = GetTickCount();

        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

		if ((KEY_DOWN(VK_DOWN) == true) && (G > 0) && (B > 0))
		{
			G = G - 1;
			B = B - 2;
		} 
		if ((KEY_DOWN(VK_UP) == true) && (G < 50) && (B < 100))
		{
			G = G + 1;
			B = B + 2;
		}

        render_frame(0, G, B);

        // check the 'escape' key
        if(KEY_DOWN(VK_ESCAPE))
            PostMessage(hWnd, WM_DESTROY, 0, 0);
		
				for (i = 0; i == 2; i++)
		{
			locationA[i] = locationA[i] + 5.0;
			locationB[i] = locationB[i] + 5.0;
			locationB[i] = locationC[i] + 5.0;
		}

		for (i = 0; i == 3; i++)
			triangleColors[i] = rand() % 255;

        while ((GetTickCount() - starting_point) < 25);

		init_graphics(locationA, locationB, locationC, triangleColors);
		t_buffer->Release();
	}

    // clean up DirectX and COM
    cleanD3D();

    return msg.wParam;
}


// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }

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


// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface

    D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information

    ZeroMemory(&d3dpp, sizeof(d3dpp));    // clear out the struct for use
    d3dpp.Windowed = FALSE;    // program fullscreen, not windowed
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
    d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;    // set the back buffer format to 32-bit
    d3dpp.BackBufferWidth = SCREEN_WIDTH;    // set the width of the buffer
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;    // set the height of the buffer


    // create a device class using this information and the info from the d3dpp stuct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);

	init_graphics(locationA, locationB, locationC, triangleColors);    // call the function to initialize the triangle

    return;
}


// this is the function used to render a single frame
void render_frame(D3DCOLOR R, D3DCOLOR G, D3DCOLOR B)
{
    // clear the window to a deep blue
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(R, G, B), 1.0f, 0);

    d3ddev->BeginScene();    // begins the 3D scene


        // select which vertex format we are using
        d3ddev->SetFVF(CUSTOMFVF);

        // select the vertex buffer to display
        d3ddev->SetStreamSource(0, t_buffer, 0, sizeof(CUSTOMVERTEX));

        // copy the vertex buffer to the back buffer
        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);


    d3ddev->EndScene();    // ends the 3D scene

    d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen

    return;
}


// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
    t_buffer->Release();    // close and release the vertex buffer
    d3ddev->Release(); // close and release the 3D device
    d3d->Release(); // close and release Direct3D

    return;
}


// this is the function that puts the 3D models into video RAM
void init_graphics(float locA[], float locB[], float locC[], DWORD color[])
{
    // create the vertices using the CUSTOMVERTEX struct
    CUSTOMVERTEX t_vert[] =
    {
        { locA[0], locA[1], 0.5f, 1.0f, D3DCOLOR_XRGB(color[0], 0, 0), },
        { locB[0], locB[1], 0.5f, 1.0f, D3DCOLOR_XRGB(0, color[1], 0), },
        { locC[0], locC[1], 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, color[2]), },
    };

    // create a vertex buffer interface called t_buffer
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               &t_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer

    // lock t_buffer and load the vertices into it
    t_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, t_vert, sizeof(t_vert));
    t_buffer->Unlock();

    return;
}
The problem is in the main loop where I declare the position of the verteces/colors. I tried changing just the colors without using arrays and it worked fine. I'm pretty sure the problem lies in the arrays. I am very new to directX and am still a beginner with c++. Thank you for any help in advance. PS What's the tag for a (C++) syntax code box?

Share this post


Link to post
Share on other sites
To help people help you, a description of the problem is needed. You do state you have a problem somewhere in 100 lines of code but you haven't told us what it is.

Give us a description of what you're trying to do and what you're getting that you don't expect or want. Also, what error checking have you done and what were the results?

EDIT: formatting tags are described in the FAQ. Click on the button in the upper right-hand corner.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this