ПрограммированиеФорумГрафика

Фленов Directx куб

#0
18:03, 3 ноя 2011

Опять учебник фленова. Компилятор MVS2010, компилируется белый экран, а должен разноцветный куб. В чем проблема?

#include <windows.h>
#include <stdlib.h>
#include <string.h>

#include <tchar.h>
#include "dxfunc.h"
#include <math.h>


static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("FUCK OFF");
HINSTANCE hInst;
int iWidth,iHeight;
IDirect3D9       *pD3D       = NULL;
IDirect3DDevice9 *pD3DDevice = NULL;


float ViewAngle=0;
IDirect3DVertexBuffer9 * vBuffer;
IDirect3DIndexBuffer9 * iBuffer;

const int iVertsNum = 24;
const int iIdxNum = 36;
const int iPointsNum = 12;

 struct sVertex
{
  float x, y, z;
  DWORD color;
};

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

void CreateQuad()
{
  const sVertex svVortexList[] = {
    -0.5f, -0.5f, -0.5f, 0x00ff0000,
    -0.5f,  0.5f, -0.5f, 0x00ff0000,
     0.5f, -0.5f, -0.5f, 0x00ff0000,
     0.5f,  0.5f, -0.5f, 0x00ff0000,

     0.5f, -0.5f, -0.5f, 0x0000ff00,
     0.5f,  0.5f, -0.5f, 0x0000ff00,
     0.5f, -0.5f,  0.5f, 0x0000ff00,
     0.5f,  0.5f,  0.5f, 0x0000ff00,

     0.5f, -0.5f,  0.5f, 0x000000ff,
     0.5f,  0.5f,  0.5f, 0x000000ff,
    -0.5f, -0.5f,  0.5f, 0x000000ff,
    -0.5f,  0.5f,  0.5f, 0x000000ff,

    -0.5f, -0.5f,  0.5f, 0x00ffff00,
    -0.5f,  0.5f,  0.5f, 0x00ffff00,
    -0.5f, -0.5f, -0.5f, 0x00ffff00,
    -0.5f,  0.5f, -0.5f, 0x00ffff00,

    -0.5f,  0.5f, -0.5f, 0x0000ffff,
    -0.5f,  0.5f,  0.5f, 0x0000ffff,
     0.5f,  0.5f, -0.5f, 0x0000ffff,
     0.5f,  0.5f,  0.5f, 0x0000ffff,

     0.5f, -0.5f, -0.5f, 0x00ff00ff,
     0.5f, -0.5f,  0.5f, 0x00ff00ff,
    -0.5f, -0.5f, -0.5f, 0x00ff00ff,
    -0.5f, -0.5f,  0.5f, 0x00ff00ff,
  };

  void * pBuf;

  HRESULT hRes = pD3DDevice->CreateVertexBuffer(sizeof(sVertex) * iVertsNum,
       D3DUSAGE_WRITEONLY, D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &vBuffer, 0);
  if (FAILED(hRes))
    return;

  // заполнение вершинного буфера
  hRes = vBuffer->Lock(0, sizeof(sVertex) * iVertsNum, &pBuf, 0);
  if (FAILED(hRes))
    return;
  memcpy(pBuf, svVortexList, sizeof(sVertex) * iVertsNum);
  vBuffer->Unlock();

  const unsigned short Idxes[]={
    0,1,2,2,1,3,
    4,5,6,6,5,7,
    8,9,10,10,9,11,
    12,13,14,14,13,15,
    16,17,18,18,17,19,
    20,21,22,22,21,23,
  };

  // создание индексного буфера
  hRes = pD3DDevice->CreateIndexBuffer( sizeof(short) * iIdxNum, 
       0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&iBuffer, 0);
  if (FAILED(hRes))
    return;

  // заполнение индексного буфера
  hRes = iBuffer->Lock(0, sizeof(short) * iIdxNum, &pBuf, 0);
  if (FAILED(hRes))
    return;
  memcpy(pBuf, Idxes, sizeof(short) * iIdxNum);
  iBuffer->Unlock();
}

void SetView()
{
float  z=1;
  D3DMATRIX View = {
    cos(z), -sin(z), 0, 0,
    sin(z), cos(z), 0, 0,
    0, 0, 1, 0,
    0, 0, 5, 1,
  };
  pD3DDevice->SetTransform(D3DTS_VIEW, &View);
}


void DrawScene()
{
  // выставляем матрицу для объекта в мировых координатах
  ViewAngle+=0.01;
  float b = ViewAngle;

  D3DMATRIX World = {
    cos(b)*cos(b), cos(b)*sin(b), sin(b), 0,
    -sin(b), cos(b), 0, 0,
    -sin(b)*cos(b), -sin(b)*sin(b), cos(b), 0,
    0, 0,  0, 1,
  };

  pD3DDevice->SetTransform(D3DTS_WORLD, &World);

  // вершинный формат
  pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);

  // вершинный буфер
  pD3DDevice->SetStreamSource(0, vBuffer, 0, sizeof(sVertex));

  // индексный буфер
  pD3DDevice->SetIndices(iBuffer);
 //pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

  // вывод объекта
  pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, iVertsNum, 0, iPointsNum);
  
}



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = WndProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName   = NULL;
wcex.lpszClassName  = szWindowClass;
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

if (!RegisterClassEx(&wcex))
{
MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL);
return 1;
}
iWidth=GetSystemMetrics(SM_CXSCREEN);
iHeight=GetSystemMetrics(SM_CYSCREEN);
hInst = hInstance; 



HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
1000, 500,
NULL,
NULL,
hInstance,
NULL);

if (!hWnd)
{
MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL);
return 1;
}



if (DX3DInit(&pD3D, &pD3DDevice, hWnd, iWidth, iHeight, FALSE)!=S_OK)
{
MessageBox(hWnd, _T("Error DX"), _T("Error"), MB_OK);
return FALSE;
}

CreateQuad();
SetView();


ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}




return (int) msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{



switch (message)
{
case WM_PAINT:
  
RECT  r;
SetRect(&r, 0, 0, iWidth, iHeight);
pD3DDevice->Clear(1, (D3DRECT*)&r, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 1.0, 0);

pD3DDevice->BeginScene();
DrawScene();

pD3DDevice->EndScene();

pD3DDevice->Present(NULL, NULL, 0, NULL);

break;
case WM_DESTROY :
if (vBuffer) {vBuffer->Release(); vBuffer=NULL;}
if (iBuffer) {iBuffer->Release(); iBuffer=NULL;}
if (pD3DDevice) {pD3DDevice= NULL; pD3DDevice=NULL;}
if (pD3D) {pD3D= NULL; pD3D=NULL;}
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
#1
18:26, 3 ноя 2011

Nikita.S.
Учебник бумажный? Если да - подожги его и туши мочой.
Если электронный - срочно форматни винты...

Полный бред в коде. Открой пример ДХ, он лежит в
Путь к СДК/Samples/C++/Direct3D/Tutorials/
и там смотри где пример с треугольником, с матрицами и т.д.
Вот с него и начинай изучение ДХ.

Удачи

#2
18:53, 3 ноя 2011

>Фленов Directx куб

лол, я подумал что фленов - это типа как маленькие дети говорят хренов)

у Френка Луны неплохой учебник для начала.

#3
18:58, 3 ноя 2011

Спасибо fzr125

#4
18:58, 3 ноя 2011

Mr F на английском?

#5
19:03, 3 ноя 2011

http://netlib.narod.ru/library/book0032/toc.htm

#6
19:28, 3 ноя 2011

Nikita.S.
Не за что =) Извини, если грубо было )))

#7
21:48, 3 ноя 2011

fzr125
> Учебник бумажный? Если да - подожги его и туши мочой.
> Если электронный - срочно форматни винты...
Отличный совет! +100500 к нему.
Пожалуй лучше если только самого Фленова поджечь и мочой потушить.

#8
21:54, 3 ноя 2011

fzr125
> подожги его и туши мочой.
хДДД отжог

#9
0:20, 4 ноя 2011

Mr F
спасибо за книжку друг!
П.С. пожалуй тоже вступлю в ряды хейтеров фленова

#10
9:39, 4 ноя 2011

Крутые примеры про примитивы

#11
12:02, 4 ноя 2011

хз, у меня примеры фленова почти всегда работали. Так что нечего афтора винить коли руки из заднего прохода. К тому же примеры писались явно не для 2010 студии, а она девочка привередливая.
Вот то, что фленов является ксероксом для генерации разнообразной макулатуры компьютерной тематики, это да. Главная его заслуга это Библия Делфи.
Кстати, будете бузеть он вас всех поломает, он же крутой хацкер.

#12
17:43, 4 ноя 2011

Nikita.S.
> static TCHAR szTitle[] = _T("FUCK OFF");
как корабль назовёшь, так он и поплывёт

или это в книге фленова так и напечатано?

ПрограммированиеФорумГрафика

Тема в архиве.