Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2014, 11:13   #11
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Структура для рендеринга сцены


Код:
#define D3DFVFCV (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

struct render8
{
int state;
struct vertex_buffer* v;

render8() { state=0; v=NULL;}
~render8(){delete_buffer(v);}

// удалить буферы
void delete_buffer(struct vertex_buffer* p){if(p) delete(p);}

// создание буферов
void create_buffer (LPDIRECT3DDEVICE8 ddev) { if(ddev) { cv* v1 = new cv[3]; v1[0].x = 150.0f; v1[0].y = 150.0f; v1[0].z = 0.5f; v1[0].rhw = 1.0f; v1[0].color = 0xffff0000; v1[1].x = 250.0f; v1[1].y = 250.0f; v1[1].z = 0.5f; v1[1].rhw = 1.0f; v1[1].color = 0xff00ff00; v1[2].x = 150.0f; v1[2].y = 250.0f; v1[2].z = 0.5f; v1[2].rhw = 1.0f; v1[2].color = 0xff00ffff; v = new vertex_buffer(ddev, 3*sizeof(cv), D3DFVFCV, v1, 3*sizeof(cv); delete [] v1; } if(ddev) { point1* v1 = new point1[2]; v1[0].x = 20.0f;v1[0].y = 20.0f; v1[0].z = 0.5f; v1[1].x = 20.0f; v1[1].y = 40.0f; v1[1].z = 0.5f;  v->add_next(ddev, 2*sizeof(point1), D3DFVFCV, v1, 2*sizeof(point1)); delete [] v1; } if(ddev) { point1* v1 = new point1[2];  v1[0].x = 20.0f;v1[0].y = 20.0f; v1[0].z = 0.5f; v1[1].x = 20.0f; v1[1].y = 40.0f; v1[1].z = 0.5f;  v->add_next(ddev, 2*sizeof(point1), D3DFVFCV, v1, 2*sizeof(point1)); delete [] v1; }}

// создание буферов
void create (LPDIRECT3DDEVICE8 ddev) {if(ddev) { state=1; create_buffer(ddev) ;}}

//начать сцену
void begin (LPDIRECT3DDEVICE8 ddev) { if(ddev) ddev->BeginScene(); ;}

// от рисовать сцену
void render_scene (LPDIRECT3DDEVICE8 ddev) { if(ddev) render_buffers(ddev) ;}

// от рисовать буферы
void render_buffers (LPDIRECT3DDEVICE8 ddev) { if(ddev) { if(v) render_buffer(ddev, v, D3DPT_TRIANGLELIST, sizeof(cv), D3DFVFCV, 1); if(v->next) render_buffer(ddev, v->next,D3DPT_LINELIST, sizeof(point1),  D3DFVFCV, 1); if(v->next->next) render_buffer(ddev, v->next->next, D3DPT_LINELIST, sizeof(point1), D3DFVFCV, 1); if(v->next->next) { vertex_buffer* pv = v->next->next; while(pv->next) { render_buffer(ddev, pv->next, D3DPT_POINTLIST, sizeof(point1), D3DFVFCV, 1); pv = pv->next; }}}  }

// отрисовка буфера
void render_buffer (LPDIRECT3DDEVICE8 ddev, vertex_buffer* v, D3DPRIMITIVETYPE t, int n,DWORD s, int y) { if(ddev) if(v) { set_shader(ddev, v, n); set_shader(s); draw_primitive(ddev, t, y) ;}}

// установить источник потока вершин
void set_stream (LPDIRECT3DDEVICE8 ddev,vertex_buffer* v, int n) { if(ddev) ddev->SetStreamSource(0, v->vb, n) ;}

// установить тип вершинного шейдера
void set_shader (LPDIRECT3DDEVICE8 ddev, DWORD s) { if(ddev) ddev->SetVertexShader(s); }

// нарисовать примитив
void draw_primitive (LPDIRECT3DDEVICE8 ddev, D3DPRIMITIVETYPE t, int y) { if(ddev) ddev->DrawPrimitive(t, 0, y); }

// закончить сцену
void end (LPDIRECT3DDEVICE8 ddev) { if(ddev) ddev->EndScene(); }

// представить сцену
void present (LPDIRECT3DDEVICE8 ddev) { if(ddev) ddev->Present(0,0,0,0);}

// сцена
void scene (LPDIRECT3DDEVICE8 ddev) { if(ddev) {begin(ddev); render_scene(ddev); end(ddev); present(ddev); } }

// очистить сцену
void clear (LPDIRECT3DDEVICE8 ddev) { if(ddev) ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,255), 1.0f, 0); else error(8); }

// реедеринг
void render_internal (LPDIRECT3DDEVICE8 ddev) { if(ddev) { clear(ddev); scene(ddev);} else error(7); }

// проверить состояние для создания буферов
void check_state (LPDIRECT3DDEVICE8 ddev) { if(ddev) if(!state) create(ddev);}

// рендеринг, точка входа
void render (LPDIRECT3DDEVICE8 ddev) { if(ddev) { check_state(ddev); render_internal(ddev);}else error(6); }

// при движении мыши создается новый буфер для отрисовки по координатам курсора мыши

void l (LPDIRECT3DDEVICE8 ddev, LPARAM lp) { if(ddev) { if(v) { if(v->next) { if(v->next->next) { vertex_buffer* pv = v->next->next; while(pv->next) pv=pv->next; point1* v1 = new point1; v1->x = (float) LOWORD(lp); v1->y = (float) HIWORD(lp); v1->z =0.5f; printf("%f %f\n", v1->x, v1->y); pv->add_next(ddev, sizeof(point1), D3DFVF_XYZ, v1, sizeof(point1)); delete [] v1; }}}}}
};
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 09.10.2014, 11:40   #12
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Структура обертка (wrapper) над DirectX 8

Код:

struct directx8
{
LPDIRECT3D8 d3d;
LPDIRECT3DDEVICE8 ddev;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE d3ddm;
struct render8* r8;
UINT adapter;
D3DDEVTYPE device_type;
DWORD flags;
D3DSWAPEFFECT swap_effect;

directx8(HWND hwnd) { nulls(); set_params(); create_dx8(); create_displaymode8(); create_presentation8(); create_device8(hwnd); r8 = new render8; }
~directx8() { shutdown_directx8(); if(r8) delete r8; }
void nulls() { r8 = NULL; d3d = NULL; ddev = NULL; }
void set_params() { adapter = D3DADAPTER_DEFAULT; device_type = D3DDEVTYPE_HAL; flags = D3DCREATE_SOFTWARE_VERTEXPROCCESSING; swap_effect = D3DSWAPEFFECT_DISCARD; }
void create_dx8() { d3d = Direct3DCreate8(D3D_SDK_VERSION); }
void create_displaymode8() { if(d3d) d3d->GetAdapterDisplayMode(adapter, &d3ddm); else error(1); }
void create_presentation8() { ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = swap_effect; d3dpp.BackBufferFormat = d3ddm.Format; }
void create_device8(HWND hwnd) { if(d3d) d3d->CreateDevicr(adapter, device_type, hwnd, flags, &d3dpp, &dddev); else error(2); }
void shutdown_dx8() { if(d3d) d3d->Release(); }
void shutdown_device8() { if(ddev) ddev->Release(); else error(5); }
void ahutdown_directx8() { shutdown_device8(); shutdown_dx8();}
void render() { if(ddev) { if(r8) r8->render(ddev); } else error(3); }
void l(LPARAM lp) { if(r8) r8->l(ddev, lp);}
};

struct program
{
WNDCLASSEX wc;
MSG msg;
HWND hwnd;
struct directx8 dx8;

program() { dx8 = NULL; }

~program(){ if(dx8) delete dx8;}

int main() {HINSTANCE hInstance = GetModuleHandle(0); LPSTR CommandLine= GetCommandLine(); return WinMain(hInstance, NULL, CommandLine, SW_SHOWDEFAULT);}

int WINAPI WinMain(HINSTANCE hInsr, HINSTANCE hPrevInst, LPSTR CmdLine, int CmdShow)
{
create_wndclass(hInst);
create_windows(hInst);
dx8 = new directx8(hwnd);
return message_cycle();
}

void create_wndclass(HINSTANCE hInst){ wc.cbSize=sizeof(WNDCLASSEX); wc.style=CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc=(WNDPROC)WndProc; wc.cbClsExtra=NULL; wc.cbWndExtra=NULL;wc.hInstance=hInst;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName="MainMenu"; wc.lpszClassName="SimpleWinClass"; wc.hIcon=LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION); wc.hCursor=LoadCursor(NULL, IDC_ARROW);RegisterClassEx(&wc);}
void create_windows(HINSTANCE hInst){ hwnd=CreateWindowEx(NULL, "SimpleWinClass","h",WS_OVERLAPPEDWINDOW, 100,100,1000,1000,NULL,(HMENU) NULL,hInst, NULL); ShowWindow(hwnd, SW_SHOWNORMAL)! UpdateWindow(hwnd);}
int message_cycle(){while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg); DispatchMessage(&msg);} return msg.wParam;}

void paint() { if(dx8) dx8->render(); }
void l( LPARAM lp) { if(dx8) dx8->l(lp);}
};

program z;
int main(int argc, char* argv[]){ return z.main();}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_MOUSEMOVE: z.l(lParam); return 0;
case WM_DESTROY: PostQuitMessage(NULL); return 0;
case WM_PAINT: z.paint(); return 0;
default: return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return DefWindowProc(hwnd,uMsg, wParam,lParam);
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 09.10.2014, 13:25   #13
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Чтобы удалить одно связный список, достаточно в деструкторе удалить следующий элемент. И он по цепочке удалится весь, так как удаляемый элемент тоже вызовет деструктор, который удалит следующий элемент. Сегодня понял, два года я неправильно это делал, так как я пролистывал список до последнего элемента. Поэтому я не стал нормальным программистом.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 10.11.2014, 17:31   #14
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Если у кого-то есть проблемы с пониманием что такое матрица мира, проекции, вида, то возможно, прикрепленный исходник поможет разобраться:
1. вывод координатных осей Ox, Oy, Oz
2. матричные преобразования на кнопках A, B, C, D (перемещение), E, F(вращение по оси), G ,H(вращение по оси), I, J (вращение по оси)
3. отрисовка треугольников
4. отрисовка куба
5. вывод матрицы мира на экран
6. вывод матрицы вида
7. вывод матрицы проекции
Вложения
Тип файла: zip dx9.zip (71.0 Кб, 6 просмотров)
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 10.11.2014, 17:35   #15
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,639
По умолчанию

Пример вывода буферов точек, треугольников, линий на экран

1. при движении курсора мыши, в буфер добавляется точка
2. при 3 кликах левой кнопкой, создается буфер с треугольником
3. при 2 кликах правой кнопкой, создается буфер с линией

directx 8
Вложения
Тип файла: zip dx8.zip (57.9 Кб, 5 просмотров)
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C чего начать? ...игра 3D RPG с использованием DirectX. Odinok Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 25.07.2011 15:16
Создание GUI в DirectX Selestis Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 02.08.2010 15:15
создание игры DirectX и C++ Nick007 Помощь студентам 0 24.03.2010 13:17
Снимок экрана приложений использующих DirectX AxenicX Общие вопросы C/C++ 1 15.02.2010 22:20
Вопросы по разработке приложений DirectX. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 13 05.11.2009 12:50