Jump to content
  • Advertisement
Sign in to follow this  
WhoCares357

Arrays & Custom Verteces?

This topic is 3639 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I just started directX with the official tutorial. This 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 = locationA + 5.0;
			locationB = locationB + 5.0;
			locationB = locationC + 5.0;
		}

		for (i = 0; i == 3; i++)
			triangleColors = 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
Advertisement
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
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!