Schlurmann
30.09.2007, 04:13
Nabend,
folgendes Problem. Ich spiele gerad mit DirectX herum und möchte einen kleinen Teapot rendern, ohne großen Aufwand. Sollte ja eigentlich kein Problem sein, aber VC++ meldet mir einfach einen blöden Fehler bei meiner eignene Funktion. Hier die einzelnen Dateien:
BasicD3DHeader.h
#include <d3d9.h>
#include <d3dx9.h>
#define SAFE_RELEASE(x) if (x != NULL) {x->Release(); x = NULL;}
#define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 1024
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
class BasicD3D
{
private:
LPDIRECT3DDEVICE9 m_D3DDevice;
LPDIRECT3D9 m_pD3D;
LPD3DXMESH m_D3DMesh;
public:
//Konstruktor
BasicD3D();
//Basic Funktionen
void BeginScene (void);
void EndScene (void);
void CleanUpD3D (void);
void InitD3D(HWND hwnd);
//Graphics
void RenderAct (void);
};
HWND CreateMainWindow(HINSTANCE hInstance);
BasicD3DHeader.cpp
#include "BasicD3DHeader.h"
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
DefWindowProc, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(BLACK_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"DX Test", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, // Anfangsposition und Größe
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
}
void BasicD3D::InitD3D(HWND hwnd)
{
D3DPRESENT_PARAMETERS PParams;
ZeroMemory(&PParams, sizeof(D3DPRESENT_PARAMETERS));
PParams.BackBufferFormat = D3DFMT_UNKNOWN;
PParams.BackBufferWidth = SCREEN_WIDTH;
PParams.BackBufferHeight = SCREEN_HEIGHT;
PParams.BackBufferCount = 1;
PParams.MultiSampleType = D3DMULTISAMPLE_NONE;
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
PParams.Windowed = true;
m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_MIXED_VERTEXPROCESSING, &PParams, &m_D3DDevice);
m_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
D3DXCreateTeapot(m_D3DDevice, &m_D3DMesh, NULL);
}
BasicD3D::BasicD3D()
{
m_pD3D = NULL;
m_D3DDevice = NULL;
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
}
void BasicD3D::CleanUpD3D()
{
SAFE_RELEASE(m_pD3D);
SAFE_RELEASE (m_D3DDevice);
SAFE_RELEASE (m_D3DMesh);
}
void BasicD3D::BeginScene(void)
{
m_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
m_D3DDevice->BeginScene();
}
void BasicD3D::EndScene(void)
{
m_D3DDevice->EndScene();
m_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
void BasicD3D::RenderAct(void)
{
D3DXMATRIX matView;
D3DXMATRIX matProjection;
D3DXMATRIX matRotateY;
static float index = 0.0f; index+=0.03f; // an ever-increasing float value
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3 (0.0f, 3.0f, 6.0f), &D3DXVECTOR3 (0.0f, 0.0f, 0.0f), &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
D3DXMatrixRotationY(&matRotateY, index);
D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(45), (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, 1.0f, 100.0f);
m_D3DDevice->SetTransform(D3DTS_VIEW, &matView);
m_D3DDevice->SetTransform(D3DTS_PROJECTION, &matProjection);
m_D3DDevice->SetTransform(D3DTS_WORLD, &(matRotateY));
m_D3DMesh->DrawSubset(0);
}
Main.cpp
#include "BasicD3DHeader.h"
MSG msg;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//D3D Variablen
BasicD3D Direct3D;
//Normal Variablen
HWND hwnd;
hwnd = CreateMainWindow(hInstance);
Direct3D.InitD3D(hwnd);
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Direct3D.BeginScene();
if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
{
PostQuitMessage(0);
}
Direct3D.RenderAct();
Direct3D.EndScene();
}
}
Direct3D.CleanUpD3D();
return 0;
}
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hwnd);
break;
}
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Folgenden Error meldet VC++ 2005 Express:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall BasicD3D::RenderAct(void)" (?RenderAct@BasicD3D@@QAEXXZ)" in Funktion "_WinMain@16".
Edit3, jetzt gehts doch wieder, wenn ich
Direct3D.RenderAct() auskommentiere, ich bitte um Hilfe. :(
Ich verstehe auch den Linker Error nicht. Benutzt die Funktion vielleicht Elemente die in einer anderen Lib liegen? d3d9 und d3dx9 habe ich doch gelinkt.
[SOLVED]
Gott weiß woran es lag. Neues Projekt gemacht, Dateien neu eingefügt, alles läuft.
folgendes Problem. Ich spiele gerad mit DirectX herum und möchte einen kleinen Teapot rendern, ohne großen Aufwand. Sollte ja eigentlich kein Problem sein, aber VC++ meldet mir einfach einen blöden Fehler bei meiner eignene Funktion. Hier die einzelnen Dateien:
BasicD3DHeader.h
#include <d3d9.h>
#include <d3dx9.h>
#define SAFE_RELEASE(x) if (x != NULL) {x->Release(); x = NULL;}
#define SCREEN_WIDTH 1280
#define SCREEN_HEIGHT 1024
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
class BasicD3D
{
private:
LPDIRECT3DDEVICE9 m_D3DDevice;
LPDIRECT3D9 m_pD3D;
LPD3DXMESH m_D3DMesh;
public:
//Konstruktor
BasicD3D();
//Basic Funktionen
void BeginScene (void);
void EndScene (void);
void CleanUpD3D (void);
void InitD3D(HWND hwnd);
//Graphics
void RenderAct (void);
};
HWND CreateMainWindow(HINSTANCE hInstance);
BasicD3DHeader.cpp
#include "BasicD3DHeader.h"
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
DefWindowProc, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(BLACK_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"DX Test", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, // Anfangsposition und Größe
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
}
void BasicD3D::InitD3D(HWND hwnd)
{
D3DPRESENT_PARAMETERS PParams;
ZeroMemory(&PParams, sizeof(D3DPRESENT_PARAMETERS));
PParams.BackBufferFormat = D3DFMT_UNKNOWN;
PParams.BackBufferWidth = SCREEN_WIDTH;
PParams.BackBufferHeight = SCREEN_HEIGHT;
PParams.BackBufferCount = 1;
PParams.MultiSampleType = D3DMULTISAMPLE_NONE;
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
PParams.Windowed = true;
m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_MIXED_VERTEXPROCESSING, &PParams, &m_D3DDevice);
m_D3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
D3DXCreateTeapot(m_D3DDevice, &m_D3DMesh, NULL);
}
BasicD3D::BasicD3D()
{
m_pD3D = NULL;
m_D3DDevice = NULL;
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
}
void BasicD3D::CleanUpD3D()
{
SAFE_RELEASE(m_pD3D);
SAFE_RELEASE (m_D3DDevice);
SAFE_RELEASE (m_D3DMesh);
}
void BasicD3D::BeginScene(void)
{
m_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
m_D3DDevice->BeginScene();
}
void BasicD3D::EndScene(void)
{
m_D3DDevice->EndScene();
m_D3DDevice->Present(NULL, NULL, NULL, NULL);
}
void BasicD3D::RenderAct(void)
{
D3DXMATRIX matView;
D3DXMATRIX matProjection;
D3DXMATRIX matRotateY;
static float index = 0.0f; index+=0.03f; // an ever-increasing float value
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3 (0.0f, 3.0f, 6.0f), &D3DXVECTOR3 (0.0f, 0.0f, 0.0f), &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));
D3DXMatrixRotationY(&matRotateY, index);
D3DXMatrixPerspectiveFovLH(&matProjection, D3DXToRadian(45), (FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, 1.0f, 100.0f);
m_D3DDevice->SetTransform(D3DTS_VIEW, &matView);
m_D3DDevice->SetTransform(D3DTS_PROJECTION, &matProjection);
m_D3DDevice->SetTransform(D3DTS_WORLD, &(matRotateY));
m_D3DMesh->DrawSubset(0);
}
Main.cpp
#include "BasicD3DHeader.h"
MSG msg;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//D3D Variablen
BasicD3D Direct3D;
//Normal Variablen
HWND hwnd;
hwnd = CreateMainWindow(hInstance);
Direct3D.InitD3D(hwnd);
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Direct3D.BeginScene();
if(GetAsyncKeyState(VK_ESCAPE) & 0x8000)
{
PostQuitMessage(0);
}
Direct3D.RenderAct();
Direct3D.EndScene();
}
}
Direct3D.CleanUpD3D();
return 0;
}
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hwnd);
break;
}
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Folgenden Error meldet VC++ 2005 Express:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall BasicD3D::RenderAct(void)" (?RenderAct@BasicD3D@@QAEXXZ)" in Funktion "_WinMain@16".
Edit3, jetzt gehts doch wieder, wenn ich
Direct3D.RenderAct() auskommentiere, ich bitte um Hilfe. :(
Ich verstehe auch den Linker Error nicht. Benutzt die Funktion vielleicht Elemente die in einer anderen Lib liegen? d3d9 und d3dx9 habe ich doch gelinkt.
[SOLVED]
Gott weiß woran es lag. Neues Projekt gemacht, Dateien neu eingefügt, alles läuft.