// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
#include <D3d9types.h>
// define the screen resolution and keyboard macros
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#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
// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void cleanD3D(void); // closes Direct3D and releases memory
void init_graphics(void); // 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)
{
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 = "WindowClass";
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL,
"WindowClass",
"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);
}
render_frame();
// check the 'escape' key
if(KEY_DOWN(VK_ESCAPE))
PostMessage(hWnd, WM_DESTROY, 0, 0);
while ((GetTickCount() - starting_point) < 25);
}
// 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)
{
//IDirect3D9 Pointer
d3d = Direct3DCreate9(D3D_SDK_VERSION);
//d3d = (LPDIRECT3D9)Direct3DCreate9(D3D9b_SDK_VERSION);
if (!d3d)
return;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
// 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(); // call the function to initialize the triangle
return;
}
// this is the function used to render a single frame
void render_frame(void)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
// 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();
d3ddev->Present(NULL, NULL, NULL, NULL);
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(void)
{
// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX t_vert[] =
{
{ 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
};
// 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;
}
-------------- Build: Debug in dxTest1 ---------------
mingw32-g++.exe -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -Wall -g -march=athlon-xp -O3 -W -g -D_UNICODE -IE:\DX90SDK\include -Ih:\MinGW\include -c H:\myProjects2\dxTest1\main.cpp -o obj\Debug\main.o
In file included from E:/DX90SDK/include/d3d9.h:211,
from H:\myProjects2\dxTest1\main.cpp:4:
E:/DX90SDK/include/d3d9types.h:25: warning: ignoring #pragma warning
E:/DX90SDK/include/d3d9types.h:1850: warning: ignoring #pragma warning
H:\myProjects2\dxTest1\main.cpp:14: warning: ignoring #pragma comment
H:\myProjects2\dxTest1\main.cpp:38: warning: unused parameter 'hPrevInstance'
H:\myProjects2\dxTest1\main.cpp:38: warning: unused parameter 'lpCmdLine'
mingw32-g++.exe -LE:\DX90SDK\lib\x86 -Lh:\MinGW\lib -o bin\Debug\dxTest1.exe obj\Debug\main.o -s -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -ld3d8
obj\Debug\main.o: In function `Z7initD3DP6HWND__':
H:/myProjects2/dxTest1/main.cpp:124: undefined reference to `Direct3DCreate9@4'
obj\Debug\main.o: In function `WinMain@16':
H:/myProjects2/dxTest1/main.cpp:124: undefined reference to `Direct3DCreate9@4'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)
2 errors, 5 warnings
#pragma comment (lib, "d3d9.lib")
#pragma *
-------------- Build: Debug in dxTest1 ---------------
mingw32-g++.exe -LE:\DX90SDK\lib\x86 -Lh:\MinGW\lib -o bin\Debug\dxTest1.exe obj\Debug\main.o -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -ld3d8
obj\Debug\main.o: In function `Z7initD3DP6HWND__':
H:/myProjects2/dxTest1/main.cpp:124: undefined reference to `Direct3DCreate9@4'
collect2: ld returned 1 exit status
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="dxTest1" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin\Debug\dxTest1.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Debug\" />
<Option object_output="obj\Debug\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin\Release\dxTest1.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Release\" />
<Option object_output="obj\Release\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-march=athlon-xp" />
<Add option="-O2" />
<Add option="-W" />
<Add directory="${#dx}" />
</Compiler>
<Linker>
<Add option="-s" />
<Add library="d3d9.lib" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-DWIN32" />
<Add option="-DNDEBUG" />
<Add option="-D_WINDOWS" />
<Add option="-D_MBCS" />
<Add directory="${#dx}\include" />
</Compiler>
<Linker>
<Add library="kernel32" />
<Add library="user32" />
<Add library="gdi32" />
<Add library="winspool" />
<Add library="comdlg32" />
<Add library="advapi32" />
<Add library="shell32" />
<Add library="ole32" />
<Add library="oleaut32" />
<Add library="uuid" />
<Add library="odbc32" />
<Add library="odbccp32" />
<Add library="d3d9" />
<Add directory="${#dx}\lib\x86" />
</Linker>
<Unit filename="main.cpp" />
<Extensions>
<code_completion />
</Extensions>
</Project>
</CodeBlocks_project_file>
Now, about the addition of libraries, have in mind that if you have 2 targets you have 3 places where you can add those linker libraries: project global, target 1 (Release) and target 2 (Debug). Maybe you've been checking only those for one of the targets.I'm sorry but I don't understand what you mean here. Where would target1 and target2 be? You can see from my .cbp file what I added. And I only added stuff to the Release target not Debug.
-------------- Build: Release in dxTest2 ---------------
mingw32-g++.exe -Wall -DWIN32 -DNDEBUG -D_WINDOWS -D_MBCS -O2 -D_UNICODE -IE:\DX90SDK\include -Ih:\MinGW\include -c H:\myProjects2\dxTest2\main.cpp -o obj\Release\main.o
In file included from E:/DX90SDK/include/d3d9.h:211,
from H:\myProjects2\dxTest2\main.cpp:4:
E:/DX90SDK/include/d3d9types.h:25: warning: ignoring #pragma warning
E:/DX90SDK/include/d3d9types.h:1850: warning: ignoring #pragma warning
In file included from E:/DX90SDK/include/d3dx9.h:47,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9math.h:19: warning: ignoring #pragma warning
In file included from E:/DX90SDK/include/d3dx9.h:47,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9math.h:1761: warning: ignoring #pragma warning
In file included from E:/DX90SDK/include/d3dx9.h:48,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9core.h:644:1: warning: multi-line comment
H:\myProjects2\dxTest2\main.cpp:16: warning: ignoring #pragma comment
H:\myProjects2\dxTest2\main.cpp:17: warning: ignoring #pragma comment
In file included from E:/DX90SDK/include/d3dx9math.h:1756,
from E:/DX90SDK/include/d3dx9.h:47,
from H:\myProjects2\dxTest2\main.cpp:5:
E:/DX90SDK/include/d3dx9math.inl: In constructor 'D3DXVECTOR2_16F::D3DXVECTOR2_16F(const D3DXFLOAT16*)':
...
E:/DX90SDK/include/d3dx9math.inl:737: warning: dereferencing type-punned pointer will break strict-aliasing rules
H:\myProjects2\dxTest2\main.cpp: In function 'void render_frame()':
H:\myProjects2\dxTest2\main.cpp:170: warning: taking address of temporary
H:\myProjects2\dxTest2\main.cpp:171: warning: taking address of temporary
H:\myProjects2\dxTest2\main.cpp:172: warning: taking address of temporary
mingw32-g++.exe -LE:\DX90SDK\lib\x86 -Lh:\MinGW\lib -o bin\Release\dxTest2.exe obj\Release\main.o -s -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -ld3d9 -ld3dx9 -mwindows
h:/mingw/bin/../lib/gcc/mingw32/4.2.0/../../../../mingw32/bin/ld.exe: cannot find -ld3dx9
collect2: ld returned 1 exit status
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="dxTest2" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="bin\Debug\dxTest2.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Debug\" />
<Option object_output="obj\Debug\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-g" />
</Compiler>
</Target>
<Target title="Release">
<Option output="bin\Release\dxTest2.exe" prefix_auto="1" extension_auto="1" />
<Option working_dir="bin\Release\" />
<Option object_output="obj\Release\" />
<Option type="0" />
<Option compiler="gcc" />
<Compiler>
<Add option="-O2" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
</Build>
<Compiler>
<Add option="-Wall" />
<Add option="-DWIN32" />
<Add option="-DNDEBUG" />
<Add option="-D_WINDOWS" />
<Add option="-D_MBCS" />
<Add directory="${#dx}\include" />
</Compiler>
<Linker>
<Add library="kernel32" />
<Add library="user32" />
<Add library="gdi32" />
<Add library="winspool" />
<Add library="comdlg32" />
<Add library="advapi32" />
<Add library="shell32" />
<Add library="ole32" />
<Add library="oleaut32" />
<Add library="uuid" />
<Add library="odbc32" />
<Add library="odbccp32" />
<Add library="d3d9" />
<Add library="d3dx9" />
<Add directory="${#dx}\lib\x86" />
<Add directory="${#dx}\lib" />
</Linker>
<Unit filename="main.cpp" />
<Extensions>
<code_completion />
</Extensions>
</Project>
</CodeBlocks_project_file>
Ooooooookay, I just had to install the Aug06 DX-SDK and everything went fine from then on! It seems that mine was a bit older.
Thanks for ur help guys :P