Шустрый

Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006
Репутация: нет Всего: нет
|
пожалуйста помогите запустить простое отображение кубика с помощью индексной буферизации. Да этого получалось все сделать, а теперь не знаю почему не отображается объект, только фон и окно. Отследить где ошибка тоже не получается... классы: | Код | #pragma once #include "main.h" #include "D3DSettings.h" #include "InitialSettings.h" #include "Object3D.h"
class GameApplication { MSG msg; HWND hWnd; // Main window HWND
char* errorMessage; // текст сообщения об ошибке // акнивно ли устройств bool isLostDevice; // Is the 3d device currently lost ? bool isActive; // Is the application active ? ulong lastFrameRate;
// direct 3d интерфейс LPDIRECT3D9 pD3D; // Direct3D Object LPDIRECT3DDEVICE9 pD3DDevice; // Direct3D Device Object D3DFILLMODE fillMode; // режим заливки
// объекты-члены других классов InitialSettings *initial; // объект инициализирующий DirectX Object3D *objectsArray; // сами 3D объекты int objectsNumber; // число 3d фигур
public: GameApplication(void); ~GameApplication(void);
int Initialize(HINSTANCE hInstance); // инициализация всех устройств int BegingGameProcess(); // начало начало игрового процесса int ReleaseInterfaces();
protected:
int Animate(); // использование матриц поворотов и анимация int CreateDisplay(HINSTANCE hInstance); // задаем параметры дисплея int BuildObjects(); // строим компаненты void ClearAndShatDown(); // заверешение игрового процесса и освобождение ресурсов // задаем состояния для D3D void SetupGameState(); void SetupRenderStates();
//Вспомогательные функции int ActiveteFrame(); // функция отрисовки кадров
};
#pragma once #include "main.h" #include "Mesh.h"
class Object3D { public: Mesh* pMesh; D3DXMATRIX mtrxWorld;
int CreateBox(LPDIRECT3DDEVICE9 pD3DDevice); int AnimateObject(LPDIRECT3DDEVICE9 pD3DDevice); Object3D(void);
~Object3D(void); };
#pragma once #include "main.h" #include "Vertex.h" class Mesh { public:
ulong vertexCount; // Number of vertices stored Vertex *pVerteces; // Simple temporary vertex array. ulong indexCount; // Number of indices stored ushort *pIndeces; // Simple temporary index array
LPDIRECT3DVERTEXBUFFER9 pVertexBuffer; // Vertex Buffer to be Rendered LPDIRECT3DINDEXBUFFER9 pIndexBuffer; // Index Buffer to be Rendered
Mesh(void); ~Mesh(void);
int AddVerteces(ulong vertexNumber); // функция выделяет новое место в массиве вершин pVerteces int AddIndeces(ulong indexNumber); // функция выделяет новое место в массиве индексов void FormBox(LPDIRECT3DDEVICE9 pD3DDevice); // просто создает кубик void ReleaseOldBuffers(); // освобождает буферные интерфейсы int BuildBuffers(LPDIRECT3DDEVICE9 pD3DDevice); // заполняет буферы int VertexBufCreateInMemory(LPDIRECT3DDEVICE9 pD3DDevice); int IndexBufCreateInMemory(LPDIRECT3DDEVICE9 pD3DDevice); };
#pragma once #include "main.h" class Vertex { public: float x; float y; float z; ulong color; Vertex(void); Vertex(float x,float y,float z, double color); ~Vertex(void); };
#pragma once
#include "main.h" class InitialSettings { protected: WNDCLASSEX windowsclass; // класс окна MSG msg; HWND hWnd; // Main window HWND
// интерфейсы LPDIRECT3D9 pD3D; LPDIRECT3DDEVICE9 pD3DDevice;
D3DDISPLAYMODE Display; D3DPRESENT_PARAMETERS Direct3DParametr;
static LRESULT CALLBACK MainWinProc (HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam ); void SetDisplayParametrs(); // установка параметров дисплея void DeleteInterfaces();
public: InitialSettings(void); ~InitialSettings(void); // Get-методы HWND GetHWND() {return hWnd;}; LPDIRECT3DDEVICE9 GetD3Device() {return pD3DDevice;}; LPDIRECT3D9 GetD3D() {return pD3D;};
// другие открытые методы int CreateWindowClass(HINSTANCE hInstance); // создает класс окна int CreateDisplay(); // создает интерфейсы Direct3D и Диспля
};
|
Добавлено через 1 минуту и 59 секунд| Код |
#include "main.h" #include "GameApplication.h"
LRESULT CALLBACK MainWinProc (HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { switch(msg) { case WM_PAINT: {
ValidateRect(hwnd,NULL); // проприсовка всей клиентской области окна. NULL - проприсовка по-умолчанию break; } case WM_DESTROY: { PostQuitMessage(0); return 0; }
}
return (DefWindowProc(hwnd,msg,wparam,lparam)); }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
GameApplication *gameAppl = new GameApplication[1]; gameAppl->Initialize(hInstance); gameAppl->BegingGameProcess();
// завершение работы программы delete[] gameAppl; gameAppl = NULL; return 1;
}
#include "GameApplication.h"
GameApplication::GameApplication(void) {
isLostDevice = false; lastFrameRate = 0; fillMode = D3DFILL_SOLID; errorMessage = new char[255]; }
GameApplication::~GameApplication(void) {
if(errorMessage) delete[] errorMessage; errorMessage = NULL;
if(objectsArray) delete[] objectsArray; objectsArray = NULL;
if(initial) delete initial; initial = NULL;
ReleaseInterfaces(); }
// инициализация устройств int GameApplication::Initialize(HINSTANCE hInstance) { // Create the primary display device if (!CreateDisplay(hInstance)) { ClearAndShatDown(); return false; }
// Build Objects if (!BuildObjects()) { ClearAndShatDown(); return false; }
// Set up all required game states SetupGameState();
// Setup our rendering environment SetupRenderStates();
return 1; }
// начало игрового процесса int GameApplication::BegingGameProcess() {
ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd); ZeroMemory(&msg,sizeof(msg));
// обработка ошибок while(msg.message!=WM_QUIT) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { ActiveteFrame(); } } return 1; }
//---------------------------------------------------------------------------- // Все закрытые функции: // ClearAndShatDown() // CreateDisplay() // BuildObjects() // SetupGameState() // SetupRenderStates() //----------------------------------------------------------------------------
// завершение и освобождение ресусов void GameApplication::ClearAndShatDown() { try { if(pD3DDevice) { pD3DDevice->Release(); pD3DDevice = NULL; }
if(pD3D) { pD3D->Release(); pD3D = NULL; } } catch(...){} } int GameApplication::CreateDisplay(HINSTANCE hInstance) {// задает параметры дисплея
initial = new InitialSettings();
if(!initial->CreateWindowClass(hInstance)) { errorMessage = "не удалось создать окно программы"; return 0; }
if(!initial->CreateDisplay()) { errorMessage = "не удалось установить парамтеры Direct3D"; return 0; } else { hWnd = initial->GetHWND();
pD3D = initial->GetD3D(); pD3D->AddRef();
pD3DDevice = initial->GetD3Device(); pD3DDevice->AddRef();
}
return 1; }
int GameApplication::BuildObjects() {// создает объекты objectsNumber = 1;
objectsArray = new Object3D[objectsNumber]; objectsArray[0].CreateBox(pD3DDevice);
return 1; }
void GameApplication::SetupGameState() {// задает все игровые параметры
}
void GameApplication::SetupRenderStates() { // задает все параметры рендеринга
// Setup our D3D Device initial states pD3DDevice->SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD ); // pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
// Setup option dependant states // pD3DDevice->SetRenderState( D3DRS_FILLMODE, fillMode );
// Setup our vertex FVF code pD3DDevice->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE );
// включить альфа-блендинг и допустить альфа-смешивание pD3DDevice ->SetRenderState(D3DRS_ALPHABLENDENABLE,true); // так определяется состояние смешивания pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
// отключить отсечение direct3D pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW); // чтобы видеть все стороны объекта. D3DRS_CULLMODE - режим отсечения; // D3DCULL_NONE - запрет этого самого отсечения
}
int GameApplication::ActiveteFrame() { // функция отрисовки кадров
pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(50,50,0),1.0f,0); Animate(); pD3DDevice->BeginScene(); //////////////////////////// for(int i=0;i<objectsNumber;i++) { // буфер вершин связываем с потоком данных устройства. pD3DDevice->SetStreamSource(0, objectsArray[i].pMesh->pVertexBuffer,0,sizeof(Vertex)); // функция устанавливает формат вершин. pD3DDevice->SetFVF(D3DFVF_FORMAT_DEFAULT); // формат индексов pD3DDevice->SetIndices(objectsArray[i].pMesh->pIndexBuffer);
// вывод примитивов pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,12,0,36); } //////////////////////////// pD3DDevice->EndScene();
pD3DDevice->Present(NULL,NULL,NULL,NULL); return 1; }
int GameApplication::Animate() {
for(int i=0;i<objectsNumber;i++) { objectsArray[i].AnimateObject(pD3DDevice); }
return 1; }
int GameApplication::ReleaseInterfaces() { try { if(pD3DDevice) pD3DDevice->Release(); pD3DDevice = NULL; if(pD3D) pD3D->Release(); pD3D = NULL; } catch(...){}
return 1; }
|
Добавлено через 3 минуты и 5 секунд| Код |
#include "InitialSettings.h"
InitialSettings::InitialSettings(void) { hWnd = NULL; }
InitialSettings::~InitialSettings(void) { hWnd = NULL; DeleteInterfaces(); }
//---------------------------------------------------------------------- // MainWinProc //---------------------------------------------------------------------- LRESULT CALLBACK InitialSettings::MainWinProc (HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam ) {
switch(msg) { case WM_PAINT: {
ValidateRect(hwnd,NULL); // проприсовка всей клиентской области окна. NULL - проприсовка по-умолчанию break; } case WM_DESTROY: { /*if(gameObject!=NULL) gameObject->DeleteDirect3D();*/ PostQuitMessage(0); return 0; }
}
return (DefWindowProc(hwnd,msg,wparam,lparam)); }
int InitialSettings::CreateWindowClass(HINSTANCE hInstance) { windowsclass.cbSize = sizeof(WNDCLASSEX); windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW; windowsclass.lpfnWndProc = MainWinProc; windowsclass.cbClsExtra = 0; windowsclass.cbWndExtra = 0; windowsclass.hInstance = hInstance; windowsclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); windowsclass.hCursor = LoadCursor(NULL,IDC_ARROW); windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); windowsclass.lpszMenuName = NULL; windowsclass.lpszClassName = "WINDOWSCLASS"; windowsclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION); // регистрируем класс if(!RegisterClassEx(&windowsclass)) return 0;
// можно создать окно if(!(hWnd = CreateWindowEx(NULL,"WINDOWSCLASS","Form Terrain from map",WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0,1024,768,NULL,NULL,hInstance,NULL))) return 0; ZeroMemory(&msg,sizeof(msg));
return 1; }
int InitialSettings::CreateDisplay() {// функция создания интерефйсов и дисплея
pD3D = Direct3DCreate9( D3D_SDK_VERSION ); if(!pD3D) {// сбой return 0; }
if(FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display))) // D3DADAPTER_DEFAULT - первичный адаптер по-умолчанию, { // Display - указатель на структуру D3DDISPLAYMODE с характеристиками, // сбой... // т.е. pMode return 0; // FAILD - макрос проверки кода на наличие сбоя, }
// устанавливаем параметры дисплея. SetDisplayParametrs();
if(FAILED( pD3D->CreateDevice(D3DADAPTER_DEFAULT, // первичный адаптер, т.е. моя видяха D3DDEVTYPE_HAL, // влияет на использования акселлерации видяхи. _HAL - используется. hWnd, // дискриптор главного окна D3DCREATE_HARDWARE_VERTEXPROCESSING, // обработка вершин. Программно. &Direct3DParametr, // используем наши параметры &pD3DDevice))) // результат от функции CreateDevice(); { // сбой... return 0; }
return 1; }
void InitialSettings::SetDisplayParametrs() {// устанавливаем параметры дисплея. ZeroMemory(&Direct3DParametr,sizeof(Direct3DParametr)); // Direct3DParametr - то что нам нужно очистить // sizeof(Direct3DParametr) - размер того, что надо очищать. Т.е. все поля D3DPRESENT_PARAMETER.
Direct3DParametr.Windowed = true; // видеорежим приложения, true - оконный режим 500х400 из в функции CreateWindowEx(); Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD; // для определения обмена буферов. Direct3DParametr.BackBufferFormat = Display.Format; // формат заднего буфера.
}
void InitialSettings::DeleteInterfaces() { try { if(pD3DDevice) { pD3DDevice->Release(); pD3DDevice = NULL; }
if(pD3D) { pD3D->Release(); pD3D = NULL; } } catch(...){} }
#include "Object3D.h"
Object3D::Object3D(void) { }
Object3D::~Object3D(void) { if(pMesh) delete pMesh; pMesh = NULL; }
int Object3D::CreateBox(LPDIRECT3DDEVICE9 pD3DDevice) { pMesh = new Mesh(); pMesh->FormBox(pD3DDevice);
return 1; }
int Object3D::AnimateObject(LPDIRECT3DDEVICE9 pD3DDevice) {
D3DXMATRIX worldMatrix; D3DXMATRIX worldMatrixRotation; D3DXMATRIX worldMatrixTranslation;
D3DXMATRIX viewMatrix; D3DXMATRIX projectionMatrix;
D3DXMATRIX worldMatrixX, worldMatrixY, worldMatrixZ, worldMatrixT; //float angle = 0.0f;
//UINT Time; //// получаем время //Time = timeGetTime()%5000; //// получаем угол вращения в радианах //FLOAT Angle = Time* (2.0f*D3DX_PI)/5000.0f ;
D3DXMatrixRotationZ(&worldMatrixRotation, 0);
pD3DDevice->SetTransform(D3DTS_WORLD,&worldMatrixRotation);
D3DXMatrixTranslation(&worldMatrixTranslation, 0, 0, 0);
D3DXMatrixMultiply(&worldMatrix,&worldMatrixRotation,&worldMatrixTranslation); mtrxWorld = worldMatrix;
pD3DDevice->SetTransform(D3DTS_WORLD,&worldMatrix); //pDirect3dDevice->SetTransform(D3DTS_WORLD,&worldMatrix);
// устанавливаем вид камеры D3DXMatrixLookAtLH(&viewMatrix, &D3DXVECTOR3(0.0f,0.0f,-22.0f),&D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f)); pD3DDevice->SetTransform(D3DTS_VIEW,&viewMatrix);
// устанавливаем проекцию D3DXMatrixPerspectiveFovLH(&projectionMatrix,D3DX_PI/4,1,1,100.f); pD3DDevice->SetTransform(D3DTS_PROJECTION,&projectionMatrix); return 1; }
|
Добавлено через 4 минуты и 33 секунды| Код | #include "Mesh.h"
Mesh::Mesh(void) { vertexCount = 0; indexCount = 0;
pVerteces = NULL; pIndeces = NULL; pVertexBuffer = NULL; pIndexBuffer = NULL; }
Mesh::~Mesh(void) {
if( pVerteces) delete[] pVerteces; pVerteces = NULL; if(pIndeces) delete[] pIndeces; pIndeces = NULL;
ReleaseOldBuffers(); }
void Mesh::ReleaseOldBuffers() {// освобождает буферные интерфейсы
if(pVertexBuffer) pVertexBuffer->Release(); pVertexBuffer = NULL; if(pIndexBuffer) pIndexBuffer->Release(); pIndexBuffer = NULL; } int Mesh::AddVerteces(ulong newVertexNumber) { // функция выделяет новое место в массиве вершин pVerteces
Vertex* tempArray; tempArray = new Vertex[vertexCount+newVertexNumber]; if(pVertexBuffer) { memcpy(tempArray,pVerteces,sizeof(Vertex)); delete[] pVerteces; pVerteces = NULL; }
pVerteces = tempArray; vertexCount+=newVertexNumber;
return 1; } int Mesh::AddIndeces(ulong newIndexNumber) { // функция выделяет новое место в массиве индексов ushort * pIndexBuffer = NULL; // Allocate new resized array if (!( pIndexBuffer = new USHORT[ indexCount + newIndexNumber ] )) return -1;
// Если буфер уже был создан ранее, то его увеличим if ( pIndeces ) { // Copy old data into new buffer memcpy( pIndexBuffer, pIndeces, indexCount * sizeof(USHORT) ); delete []pIndeces; } pIndeces = pIndexBuffer; indexCount += newIndexNumber;
return 1; } int Mesh::BuildBuffers(LPDIRECT3DDEVICE9 pD3DDevice) {// функция формирует буферы индексов и вершин
// освобождает буферные интерфейсы ReleaseOldBuffers();
VertexBufCreateInMemory(pD3DDevice); IndexBufCreateInMemory(pD3DDevice);
return 1; }
|
|