Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// DX-Fensterhandle erstellen HINSTANCE hInstance = (HINSTANCE)System::Runtime::InteropServices::Marshal::GetHINSTANCE(form->GetType()->Module).ToPointer(); WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = &WindowProc; wc.hInstance = hInstance; wc.hbrBackground = NULL; wc.lpszClassName = L"WindowClass"; RegisterClassEx(&wc); Control^ panel = form->GetDrawingOutputInterface(); // Das Steuerelement, in das gezeichnet werden soll hDX9 = CreateWindowEx( NULL, L"WindowClass", NULL, WS_CHILD, panel->ClientRectangle.X, panel->ClientRectangle.Y, panel->Width, panel->Height, (HWND)(void*)panel->Handle.ToPointer(), NULL, hInstance, NULL); ShowWindow(hDX9, SW_SHOW); initD3D(hDX9); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
void initD3D(HWND hHandle) { 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 = true; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hHandle; pin_ptr<IDirect3DDevice9*> p = &d3ddev; IDirect3DDevice9** pinnedPtr = p; d3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hHandle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, pinnedPtr); d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); d3ddev->SetRenderState(D3DRS_COLORVERTEX, TRUE); d3ddev->SetRenderState(D3DRS_ZENABLE, FALSE); d3ddev->SetRenderState(D3DRS_DITHERENABLE, TRUE); d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); D3DXMATRIX matrix; D3DXMatrixIdentity(&matrix); d3ddev->SetTransform( D3DTS_VIEW, &matrix); d3ddev->SetTransform( D3DTS_PROJECTION, &matrix); d3ddev->SetTransform( D3DTS_WORLD, &matrix); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
struct COLVertex { float x, y, z; D3DCOLOR c; COLVertex() { } COLVertex(const float fx, const float fy, D3DCOLOR col) : x(fx), y(fy), z(0.0f), c(col) { } static const DWORD dwFVF; }; const DWORD COLVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(100, 40, 100), 1.0f, 0); d3ddev->BeginScene(); COLVertex* a = new COLVertex[4]; a[0] = COLVertex(-100,-100,D3DCOLOR_XRGB(255,255,255)); a[1] = COLVertex(-100, 100,D3DCOLOR_XRGB(255,255,255)); a[2] = COLVertex( 100, 100,D3DCOLOR_XRGB(255,255,255)); a[3] = COLVertex( 100,-100,D3DCOLOR_XRGB(255,255,255)); d3ddev->SetFVF(COLVertex::dwFVF); d3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, a, 0); delete[] a; d3ddev->EndScene(); d3ddev->Present(NULL, NULL, NULL, NULL); |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
C-/C++-Quelltext |
|
1 |
hDX9 = (HWND)panel->Handle.ToPointer(); |
Das Gesamte Programm ist schon in C++/CLI fertig. Und weil es ziemlich groß ist, werde ich nicht alles neu schreiben, zumal ich dort ausgiebigen Gebrauch der NET-Klassen mache.
Wenn ich mir das Handle so hole, ist das Ergebniss das selbe, nur dass das lila noch bei jedem Paint flackert. (Unabhängig davon, ob ich die Primitiven zeichne, oder nicht)
C-/C++-Quelltext
1 hDX9 = (HWND)panel->Handle.ToPointer();
Das Array dient nur zum unkomplizierten Testen der Zeichenfunktion.
D3DCREATE_SOFTWARE_VERTEXPROCESSING oder Hardware ist doch hierfür nicht wichtig oder? Übrigens ergeben sich bei mir dadurch sowieso keine Performancevorteile.
Ich habe deinen Vorschlag mit den X-Koordinaten mal ausprobiert. Leider ohne Erfolg. In dem Spiel, für das der Editor ist, mache ich es auch so und es funktioniert.
Allerdings verwendet das Spiel auch einen Shader. Könnte es daran liegen, dass es da klappt und hier nicht?
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (01.11.2012, 17:34)
Im Prinzip kann ich deine Argumente ja verstehen. Allerdings verwende ich C++/CLI doch genau dafür, um managed mit unmanaged zu kombinieren.
Die Direct3D Debug Runtime gibt keine Fehler aus, wenn ich D3DCREATE_HARDWARE_VERTEXPROCESSING verwende. (Bei Software aber schon)
Nur hilft mir das nicht bei meinem Problem weiter! Ich glaube ich werde den Kern des Programms in dlls kompilieren (ganz systemeigen) und die Benutzeroberfläche dann neu in C# schreiben.
Falls es einen unkomplizierteren Weg gibt: Ich bin offen für Neuerungen
Zitat
Naja, ich ging halt davon aus, dass du deine komplette Software inkl. GUI und was weiß ich was noch in C++/CLI gecodet hast!? Wenn du nur den Rendering Teil in C++/CLI schreibst und diesen dann z.B. von deiner C# GUI aus verwendest, dann hast du C++/CLI imo richtig eingesetzt. So wie ich das verstanden hab, ist das bei dir aber nicht der Fall!?
Zitat
Naja, du könntest z.B. einfach fertige .NET Bindings wie SlimDX oder SharpDX verwenden. Das macht aber vor allem Sinn, wenn man eben z.B. C# verwendet. Da du sowieso schon mit C++/CLI unterwegs bist, wirst du nicht besonders viel davon haben...
Werbeanzeige