Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчеты по Курсовой Работе / DirectX9 8-78-3 Коробейников Н.С..docx
Скачиваний:
50
Добавлен:
12.03.2015
Размер:
212.14 Кб
Скачать

Исходный код программы

.586

.MMX

.XMM

.MODEL FLAT, STDCALL

OPTION CASEMAP:none

INCLUDE \masm32\Include\windows.inc ; Структуры, константы ...

INCLUDE \masm32\Include\kernel32.inc ; Системные функции приложения ...

INCLUDE \masm32\Include\user32.inc ; Интерфейс ...

INCLUDE \masm32\Include\gdi32.inc ; Графический вывод ...

INCLUDE \masm32\include\winmm.inc ; Функция timeGetTime

INCLUDELIB \masm32\Lib\kernel32.lib

INCLUDELIB \masm32\Lib\user32.lib

INCLUDELIB \masm32\Lib\gdi32.lib

INCLUDELIB \masm32\lib\winmm.lib

INCLUDE \masm32\Dxsdk90\Include\2005_jun\d3d9_all.inc

INCLUDELIB \masm32\Dxsdk90\Lib\2005_jun\d3d9.lib

INCLUDELIB \masm32\Dxsdk90\Lib\2005_jun\d3dx9.lib ; Подключение D3DX функций (динамическая библиотека)

;ПРОТОТИПЫ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Init_Direct3D PROTO ; Текст этих функций можно найти ниже

Destroy_Direct3D PROTO

Release_Object PROTO :DWORD

Set_Render_Parameters PROTO

Init_Scene PROTO

Render_Scene PROTO

;==============================================================================

; Основная часть

;==============================================================================

.DATA ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

szClassName db "MyClass", 0

szAppName db "DX9_Ku"," ",169,"Nikita", 0

;WNDCLASSEX --------------------------------------------

cbSize dd 12*4

style dd CS_HREDRAW+CS_VREDRAW+20h

lpfnWndProc dd OFFSET WndProc

cbClsExtra dd 0

cbWndExtra dd 0

hInstance dd 400000h

hIcon dd 0

hCursor dd 0

hbrBackground dd BLACK_PEN

lpszMenuName dd 0

lpszClassName dd OFFSET szClassName

hIconSm dd 0

;Сообщения об ошибках ----------------------------------

szDirect3D9 db "Не удалось создать обьект Direct3D9",9,9,0

szD3DDevice9 db "Не удалось создать устройство Direct3D9",9,0

.DATA? ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

msg MSG <>

hwnd HWND ?

clientwindow RECT <>

.CONST ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

WIN_X EQU 640 ; Размер окна по горизонтали

WIN_Y EQU 480 ; Размер окна по вертикали

.CODE ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Start:

invoke GetModuleHandle, NULL

mov hInstance, eax

invoke LoadCursor, NULL, IDC_ARROW

mov hCursor, eax

invoke RegisterClassEx, ADDR cbSize

invoke GetSystemMetrics, SM_CXSCREEN

push eax

invoke GetSystemMetrics, SM_CYSCREEN

sub eax, WIN_Y

shr eax, 1

pop ebx

sub ebx, WIN_X

shr ebx, 1

invoke CreateWindowEx, NULL, ADDR szClassName, ADDR szAppName,\

WS_SYSMENU or WS_VISIBLE, \

ebx, eax, WIN_X, WIN_Y, NULL, NULL, hInstance, NULL

mov hwnd, eax

invoke GetClientRect, eax, ADDR clientwindow

invoke Init_Direct3D ; Создаем устройство

msg_loop:

invoke PeekMessageA, ADDR msg, 0 , 0 , 0 , PM_REMOVE ;

test eax, eax ;

jne message ; Если у окна нет сообщений...

;

invoke Render_Scene ; ... то отрисовывается сцена

jmp msg_loop ;

;

message: ;

mov eax, DWORD PTR msg.message ;

cmp eax, WM_QUIT ;

je end_loop ;

;

invoke TranslateMessage, ADDR msg ;

invoke DispatchMessage, ADDR msg ;

jmp msg_loop

end_loop:

mov eax, msg.wParam ; Если цикл обработки сообщений прерван,

; то код выхода из программы передается в поле wParam

Exit: ; сообщения MSG.

invoke ExitProcess, eax

ret

;==============================================================================

WndProc proc hWnd:HWND , uMsg:UINT, wParam:WPARAM, lParam:LPARAM

;==============================================================================

cmp uMsg, WM_CREATE ; Это сообщение посылается окну, когда оно создается

je wmCreate

cmp uMsg, WM_DESTROY ; Это сообщение посылается окну, когда оно должно быть уничтожено.

je wmDestroy

cmp uMsg, WM_KEYDOWN ; Это сообщение посылается окну, когда нажали клавишу на клавиатуре.

je wmKeydown

invoke DefWindowProc, hWnd, uMsg, wParam, lParam ; Если Мы НЕ ХОТИМ обрабатывать полученное сообщение, то

ret ; нам надо вызвать DefWindowProc с параметрами, которые Мы получили.

; Эта функция API обрабатывает не интересующие Нас события.

wmDestroy: ;------------------------------------------

invoke Destroy_Direct3D

invoke PostQuitMessage, NULL

xor eax,eax

ret

wmCreate: ;------------------------------------------

xor eax, eax

ret

wmKeydown: ;------------------------------------------

mov eax, wParam

cmp eax, VK_ESCAPE

jne noExit

invoke SendMessage, hwnd , WM_CLOSE , NULL, NULL

noExit:

xor eax, eax

ret

WndProc endp

;==============================================================================

; Начинается работа с Direct3D

;==============================================================================

Init_Direct3D proc ; Создавать Direct3DDevice в сообщении WM_Create нельзя !

.DATA

;D3DPRESENT_PARAMETERS ------------------------------------------

BackBufferWidth dd 640 ; Ширина BackBuffer

BackBufferHeight dd 480 ; Высота BackBuffer

BackBufferFormat dd D3DFMT_X8R8G8B8 ; Формат используемой поверхности

BackBufferCount dd 3 ; число Back буферов.

MultiSampleType dd 0 ; уровни мультисэмплинга картинки. (обычно от 2-ух и выше)

MultiSampleQuality dd 0 ;

SwapEffect dd D3DSWAPEFFECT_FLIP ; Эффект обмена поверхностей (BackBuffer)

hDeviceWindow dd 0 ; ID нашего окошка

Windowed dd 1 ; 0 - полноэкранный, 1 - в окошке

EnableAutoDepthStencil dd TRUE ; 1 - Direct3D создает Z + Stencil буфер. Если 0 - ничего не будет создано

AutoDepthStencilFormat dd D3DFMT_D24S8 ; Формат используемой поверхности

Flags dd 1 ; 0 или D3DPRESENTFLAG_LOCKABLE_BACKBUFFER=1

FullScreen_RefreshRateInHz dd 0 ; Частота обновления экрана в Hz

FullScreen_PresentationInterval dd 1 ; Интервал показа на экране backbufferа. 1 = Ждать обратного хода луча

.DATA?

pd3d dd ? ; или LPDIRECT3D9 (указатель на Direct3D9)

pd3dDevice dd ? ; или LPDIRECT3DDEVICE9 (указатель на Direct3DDevice)

.CODE

invoke Direct3DCreate9,D3D_SDK_VERSION

mov pd3d, eax

test eax, eax

jnz @F

push OFFSET szDirect3D9

jmp Error_Message

@@:

push clientwindow.right

pop BackBufferWidth

push clientwindow.bottom

pop BackBufferHeight

d3d9 CreateDevice, pd3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd ,\

D3DCREATE_SOFTWARE_VERTEXPROCESSING, \

ADDR BackBufferWidth, ADDR pd3dDevice

test eax, eax ; Если возникла ошибка при создании устройства

jz @F

push OFFSET szD3DDevice9

jmp Error_Message

@@:

invoke Init_Scene

invoke Set_Render_Parameters

ret

Init_Direct3D endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Init_Scene proc

.DATA

EyeVector D3DVECTOR <-500.0f, 160.0f, 730.0f> ; Координаты камеры в пространстве

LookAtVector D3DVECTOR <0.0f,230.0f, 0.0f> ; Указывает куда смотрит камера

UpVector D3DVECTOR <0.0f, 1.0f, 0.0f> ; Верх камеры. Обычно берется 0.0,1.0,0.0

PosLight D3DCOLORVALUE <-58335.0f ,53913.0f ,0.0f ,0.0f >

FieldOfView dd 0.7853981635f

AspectRatio dd NULL ; AspectRatio

NearViewPlanZ dd 50.0f ; Передняя отсекающая плоскость

FarViewPlanZ dd 180000.0f ; Задняя отсекающая плоскость

.DATA?

m_VS1 D3DXMATRIX <?>

WorldMatrix D3DMATRIX <?> ; Мировая матрица

ViewMatrix D3DMATRIX <?> ; Матрица вида

ProjectionMatrix D3DMATRIX <?> ; Матрица проекции

BackBufferP LPDIRECT3DSURFACE9 ?

ZStenBackBufferP LPDIRECT3DSURFACE9 ?

DepthTargP LPDIRECT3DSURFACE9 ?

.CODE

fild BackBufferWidth ; Вычисление Aspect (можно просто сразу поместить 1.33(3)f)

fild BackBufferHeight

fdiv

fstp AspectRatio

invoke D3DXMatrixRotationY, ADDR WorldMatrix, NULL ;World Matrix (мировая матрица)

invoke D3DXMatrixLookAtLH, ADDR ViewMatrix, ADDR EyeVector, \ ;View Matrix (матрица вида)

ADDR LookAtVector, ADDR UpVector

invoke D3DXMatrixPerspectiveFovLH, ADDR ProjectionMatrix, FieldOfView,\ ;Matrix Projection (матрица проекции)

AspectRatio, NearViewPlanZ, FarViewPlanZ

;ScreenSpace

.DATA

;Таргет размеры

SSP_XY_640_480 D3DCOLORVALUE <0.0015625f ,0.002083f ,0.0f ,0.0f > ; Константы

SSEyeV D3DVECTOR <0.0f, 0.0f, -1.0f> ; Координаты камеры в пространстве

SSLookAtV D3DVECTOR <0.0f,0.0f, 0.0f> ; Указывает куда смотрит камера

SSUpV D3DVECTOR <0.0f, 1.0f, 0.0f> ; Верх камеры. Обычно берется 0.0,1.0,0.0

SSFieldOfView dd 0.3926990817f ;D3DX_PI4 ;0.7853981635f

SSAspectRatio dd 1.0f ; AspectRatio

SSNearViewPlanZ dd 0.0f ; Передняя отсекающая плоскость

SSFarViewPlanZ dd 1.0f

.DATA?

SSViewMatrix D3DMATRIX <?>

SSProjectionMatrix D3DMATRIX <?>

SSViewProjection D3DMATRIX <?>

m_SS D3DMATRIX <?>

.CODE

invoke D3DXMatrixLookAtLH, ADDR SSViewMatrix, ADDR SSEyeV, \ ;View Matrix (матрица вида)

ADDR SSLookAtV, ADDR SSUpV

invoke D3DXMatrixPerspectiveFovLH, ADDR SSProjectionMatrix, SSFieldOfView,\ ;Matrix Projection (матрица проекции)

SSAspectRatio, SSNearViewPlanZ, SSFarViewPlanZ

invoke D3DXMatrixMultiply, ADDR m_SS , ADDR SSViewMatrix, ADDR SSProjectionMatrix

invoke D3DXMatrixTranspose , ADDR SSViewProjection, ADDR m_SS

; начальная загрузка

; Таргеты

d3dev9 GetRenderTarget, pd3dDevice, 0, addr BackBufferP

d3dev9 GetDepthStencilSurface,pd3dDevice,addr ZStenBackBufferP

d3dev9 CreateDepthStencilSurface,pd3dDevice, 1024,1024,AutoDepthStencilFormat,D3DMULTISAMPLE_NONE,0,TRUE,ADDR DepthTargP,0

.DATA?

CartoonRen dd ?

CartoonRenP dd ?

.CODE

d3dev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr CartoonRen,0

.DATA

CartoonRenEER db "Create error CartoonRen",0

.CODE

test eax, eax

jz @F

push OFFSET CartoonRenEER

jmp Error_Message

@@:

d3dtex9 GetSurfaceLevel, CartoonRen,0,addr CartoonRenP

.DATA

CartoonRenPEER db "Create error CartoonRenP",0

.CODE

test eax, eax

jz @F

push OFFSET CartoonRenPEER

jmp Error_Message

@@:

.DATA?

NormalRen dd ?

NormalRenP dd ?

.CODE

d3dev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr NormalRen,0

.DATA

NormalRenEER db "Create error NormalRen",0

.CODE

test eax, eax

jz @F

push OFFSET NormalRenEER

jmp Error_Message

@@:

d3dtex9 GetSurfaceLevel, NormalRen,0,addr NormalRenP

.DATA

NormalRenPEER db "Create error NormalRenP",0

.CODE

test eax, eax

jz @F

push OFFSET NormalRenPEER

jmp Error_Message

@@:

.DATA

tefect db "texture\tefect.bmp", 0

.DATA?

tefectP dd ?

.CODE

invoke D3DXCreateTextureFromFileA, pd3dDevice, addr tefect, addr tefectP

.DATA

tefectEER db "Create error tefect",0

.CODE

test eax, eax

jz @F

push OFFSET tefectEER

jmp Error_Message

@@:

.DATA

Ekran db "model\Ekran.x", 0

.DATA?

EkranP dd ?

.CODE

invoke D3DXLoadMeshFromXA, addr Ekran, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr EkranP

.DATA

EkranEER db "Create error Ekran",0

.CODE

test eax, eax

jz @F

push OFFSET EkranEER

jmp Error_Message

@@:

.DATA?

EkranPT dd ?

EkranPB dd ?

EkranP_VB dd ?

EkranP_IB dd ?

EkranP_NV dd ?

EkranP_NF dd ?

.CODE

d3dxmesh GetFVF,EkranP

mov EkranPT,eax

d3dxmesh GetNumBytesPerVertex,EkranP

mov EkranPB,eax

d3dxmesh GetVertexBuffer,EkranP, addr EkranP_VB

d3dxmesh GetIndexBuffer,EkranP, addr EkranP_IB

d3dxmesh GetNumVertices,EkranP

mov EkranP_NV,eax

d3dxmesh GetNumFaces,EkranP

mov EkranP_NF,eax

.DATA

kamen db "model\kamen.x", 0

.DATA?

kamenP dd ?

.CODE

invoke D3DXLoadMeshFromXA, addr kamen, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr kamenP

.DATA

kamenEER db "Create error kamen",0

.CODE

test eax, eax

jz @F

push OFFSET kamenEER

jmp Error_Message

@@:

.DATA?

kamenPT dd ?

kamenPB dd ?

kamenP_VB dd ?

kamenP_IB dd ?

kamenP_NV dd ?

kamenP_NF dd ?

.CODE

d3dxmesh GetFVF,kamenP

mov kamenPT,eax

d3dxmesh GetNumBytesPerVertex,kamenP

mov kamenPB,eax

d3dxmesh GetVertexBuffer,kamenP, addr kamenP_VB

d3dxmesh GetIndexBuffer,kamenP, addr kamenP_IB

d3dxmesh GetNumVertices,kamenP

mov kamenP_NV,eax

d3dxmesh GetNumFaces,kamenP

mov kamenP_NF,eax

.DATA

nebo db "model\nebo.x", 0

.DATA?

neboP dd ?

.CODE

invoke D3DXLoadMeshFromXA, addr nebo, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr neboP

.DATA

neboEER db "Create error nebo",0

.CODE

test eax, eax

jz @F

push OFFSET neboEER

jmp Error_Message

@@:

.DATA?

neboPT dd ?

neboPB dd ?

neboP_VB dd ?

neboP_IB dd ?

neboP_NV dd ?

neboP_NF dd ?

.CODE

d3dxmesh GetFVF,neboP

mov neboPT,eax

d3dxmesh GetNumBytesPerVertex,neboP

mov neboPB,eax

d3dxmesh GetVertexBuffer,neboP, addr neboP_VB

d3dxmesh GetIndexBuffer,neboP, addr neboP_IB

d3dxmesh GetNumVertices,neboP

mov neboP_NV,eax

d3dxmesh GetNumFaces,neboP

mov neboP_NF,eax

.DATA

palmi db "model\palmi.x", 0

.DATA?

palmiP dd ?

.CODE

invoke D3DXLoadMeshFromXA, addr palmi, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr palmiP

.DATA

palmiEER db "Create error palmi",0

.CODE

test eax, eax

jz @F

push OFFSET palmiEER

jmp Error_Message

@@:

.DATA?

palmiPT dd ?

palmiPB dd ?

palmiP_VB dd ?

palmiP_IB dd ?

palmiP_NV dd ?

palmiP_NF dd ?

.CODE

d3dxmesh GetFVF,palmiP

mov palmiPT,eax

d3dxmesh GetNumBytesPerVertex,palmiP

mov palmiPB,eax

d3dxmesh GetVertexBuffer,palmiP, addr palmiP_VB

d3dxmesh GetIndexBuffer,palmiP, addr palmiP_IB

d3dxmesh GetNumVertices,palmiP

mov palmiP_NV,eax

d3dxmesh GetNumFaces,palmiP

mov palmiP_NF,eax

.DATA

woda db "model\woda.x", 0

.DATA?

wodaP dd ?

.CODE

invoke D3DXLoadMeshFromXA, addr woda, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr wodaP

.DATA

wodaEER db "Create error woda",0

.CODE

test eax, eax

jz @F

push OFFSET wodaEER

jmp Error_Message

@@:

.DATA?

wodaPT dd ?

wodaPB dd ?

wodaP_VB dd ?

wodaP_IB dd ?

wodaP_NV dd ?

wodaP_NF dd ?

.CODE

d3dxmesh GetFVF,wodaP

mov wodaPT,eax

d3dxmesh GetNumBytesPerVertex,wodaP

mov wodaPB,eax

d3dxmesh GetVertexBuffer,wodaP, addr wodaP_VB

d3dxmesh GetIndexBuffer,wodaP, addr wodaP_IB

d3dxmesh GetNumVertices,wodaP

mov wodaP_NV,eax

d3dxmesh GetNumFaces,wodaP

mov wodaP_NF,eax

.DATA

zemla db "model\zemla.x", 0

.DATA?

zemlaP dd ?

.CODE

invoke D3DXLoadMeshFromXA, addr zemla, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr zemlaP

.DATA

zemlaEER db "Create error zemla",0

.CODE

test eax, eax

jz @F

push OFFSET zemlaEER

jmp Error_Message

@@:

.DATA?

zemlaPT dd ?

zemlaPB dd ?

zemlaP_VB dd ?

zemlaP_IB dd ?

zemlaP_NV dd ?

zemlaP_NF dd ?

.CODE

d3dxmesh GetFVF,zemlaP

mov zemlaPT,eax

d3dxmesh GetNumBytesPerVertex,zemlaP

mov zemlaPB,eax

d3dxmesh GetVertexBuffer,zemlaP, addr zemlaP_VB

d3dxmesh GetIndexBuffer,zemlaP, addr zemlaP_IB

d3dxmesh GetNumVertices,zemlaP

mov zemlaP_NV,eax

d3dxmesh GetNumFaces,zemlaP

mov zemlaP_NF,eax

.DATA

f_vsEkran db "shaders\vsEkran.inc", 0

.DATA?

a_vsEkran LPD3DXBUFFER ?

b_vsEkran dd ?

c_vsEkran LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsEkran, 0, 0, D3DXSHADER_DEBUG, addr a_vsEkran,0

.DATA

Z_vsEkranEER db "Create error Z_vsEkran",0

.CODE

test eax, eax

jz @F

push OFFSET Z_vsEkranEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsEkran

mov b_vsEkran,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsEkran ,addr c_vsEkran

.DATA

C_vsEkranEER db "Create error C_vsEkran",0

.CODE

test eax, eax

jz @F

push OFFSET C_vsEkranEER

jmp Error_Message

@@:

.DATA

f_vsKamen db "shaders\vsKamen.inc", 0

.DATA?

a_vsKamen LPD3DXBUFFER ?

b_vsKamen dd ?

c_vsKamen LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsKamen, 0, 0, D3DXSHADER_DEBUG, addr a_vsKamen,0

.DATA

Z_vsKamenEER db "Create error Z_vsKamen",0

.CODE

test eax, eax

jz @F

push OFFSET Z_vsKamenEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsKamen

mov b_vsKamen,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsKamen ,addr c_vsKamen

.DATA

C_vsKamenEER db "Create error C_vsKamen",0

.CODE

test eax, eax

jz @F

push OFFSET C_vsKamenEER

jmp Error_Message

@@:

.DATA

f_vsNebo db "shaders\vsNebo.inc", 0

.DATA?

a_vsNebo LPD3DXBUFFER ?

b_vsNebo dd ?

c_vsNebo LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsNebo, 0, 0, D3DXSHADER_DEBUG, addr a_vsNebo,0

.DATA

Z_vsNeboEER db "Create error Z_vsNebo",0

.CODE

test eax, eax

jz @F

push OFFSET Z_vsNeboEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsNebo

mov b_vsNebo,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsNebo ,addr c_vsNebo

.DATA

C_vsNeboEER db "Create error C_vsNebo",0

.CODE

test eax, eax

jz @F

push OFFSET C_vsNeboEER

jmp Error_Message

@@:

.DATA

f_vsSun db "shaders\vsSun.inc", 0

.DATA?

a_vsSun LPD3DXBUFFER ?

b_vsSun dd ?

c_vsSun LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsSun, 0, 0, D3DXSHADER_DEBUG, addr a_vsSun,0

.DATA

Z_vsSunEER db "Create error Z_vsSun",0

.CODE

test eax, eax

jz @F

push OFFSET Z_vsSunEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsSun

mov b_vsSun,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsSun ,addr c_vsSun

.DATA

C_vsSunEER db "Create error C_vsSun",0

.CODE

test eax, eax

jz @F

push OFFSET C_vsSunEER

jmp Error_Message

@@:

.DATA

f_vsWater db "shaders\vsWater.inc", 0

.DATA?

a_vsWater LPD3DXBUFFER ?

b_vsWater dd ?

c_vsWater LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsWater, 0, 0, D3DXSHADER_DEBUG, addr a_vsWater,0

.DATA

Z_vsWaterEER db "Create error Z_vsWater",0

.CODE

test eax, eax

jz @F

push OFFSET Z_vsWaterEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsWater

mov b_vsWater,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsWater ,addr c_vsWater

.DATA

C_vsWaterEER db "Create error C_vsWater",0

.CODE

test eax, eax

jz @F

push OFFSET C_vsWaterEER

jmp Error_Message

@@:

.DATA

f_vsZemla db "shaders\vsZemla.inc", 0

.DATA?

a_vsZemla LPD3DXBUFFER ?

b_vsZemla dd ?

c_vsZemla LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsZemla, 0, 0, D3DXSHADER_DEBUG, addr a_vsZemla,0

.DATA

Z_vsZemlaEER db "Create error Z_vsZemla",0

.CODE

test eax, eax

jz @F

push OFFSET Z_vsZemlaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsZemla

mov b_vsZemla,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsZemla ,addr c_vsZemla

.DATA

C_vsZemlaEER db "Create error C_vsZemla",0

.CODE

test eax, eax

jz @F

push OFFSET C_vsZemlaEER

jmp Error_Message

@@:

.DATA

f_psEkran db "shaders\psEkran.inc", 0

.DATA?

a_psEkran LPD3DXBUFFER ?

b_psEkran dd ?

c_psEkran LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psEkran, 0, 0, D3DXSHADER_DEBUG, addr a_psEkran,0

.DATA

Z_psEkranEER db "Create error Z_psEkran",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psEkranEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psEkran

mov b_psEkran,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psEkran ,addr c_psEkran

.DATA

C_psEkranEER db "Create error C_psEkran",0

.CODE

test eax, eax

jz @F

push OFFSET C_psEkranEER

jmp Error_Message

@@:

.DATA

f_psKamen db "shaders\psKamen.inc", 0

.DATA?

a_psKamen LPD3DXBUFFER ?

b_psKamen dd ?

c_psKamen LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psKamen, 0, 0, D3DXSHADER_DEBUG, addr a_psKamen,0

.DATA

Z_psKamenEER db "Create error Z_psKamen",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psKamenEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psKamen

mov b_psKamen,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psKamen ,addr c_psKamen

.DATA

C_psKamenEER db "Create error C_psKamen",0

.CODE

test eax, eax

jz @F

push OFFSET C_psKamenEER

jmp Error_Message

@@:

.DATA

f_psNebo db "shaders\psNebo.inc", 0

.DATA?

a_psNebo LPD3DXBUFFER ?

b_psNebo dd ?

c_psNebo LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psNebo, 0, 0, D3DXSHADER_DEBUG, addr a_psNebo,0

.DATA

Z_psNeboEER db "Create error Z_psNebo",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psNeboEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psNebo

mov b_psNebo,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psNebo ,addr c_psNebo

.DATA

C_psNeboEER db "Create error C_psNebo",0

.CODE

test eax, eax

jz @F

push OFFSET C_psNeboEER

jmp Error_Message

@@:

.DATA

f_psPalma db "shaders\psPalma.inc", 0

.DATA?

a_psPalma LPD3DXBUFFER ?

b_psPalma dd ?

c_psPalma LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psPalma, 0, 0, D3DXSHADER_DEBUG, addr a_psPalma,0

.DATA

Z_psPalmaEER db "Create error Z_psPalma",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psPalmaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psPalma

mov b_psPalma,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psPalma ,addr c_psPalma

.DATA

C_psPalmaEER db "Create error C_psPalma",0

.CODE

test eax, eax

jz @F

push OFFSET C_psPalmaEER

jmp Error_Message

@@:

.DATA

f_psSun db "shaders\psSun.inc", 0

.DATA?

a_psSun LPD3DXBUFFER ?

b_psSun dd ?

c_psSun LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psSun, 0, 0, D3DXSHADER_DEBUG, addr a_psSun,0

.DATA

Z_psSunEER db "Create error Z_psSun",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psSunEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psSun

mov b_psSun,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psSun ,addr c_psSun

.DATA

C_psSunEER db "Create error C_psSun",0

.CODE

test eax, eax

jz @F

push OFFSET C_psSunEER

jmp Error_Message

@@:

.DATA

f_psWater db "shaders\psWater.inc", 0

.DATA?

a_psWater LPD3DXBUFFER ?

b_psWater dd ?

c_psWater LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psWater, 0, 0, D3DXSHADER_DEBUG, addr a_psWater,0

.DATA

Z_psWaterEER db "Create error Z_psWater",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psWaterEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psWater

mov b_psWater,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psWater ,addr c_psWater

.DATA

C_psWaterEER db "Create error C_psWater",0

.CODE

test eax, eax

jz @F

push OFFSET C_psWaterEER

jmp Error_Message

@@:

.DATA

f_psZemla db "shaders\psZemla.inc", 0

.DATA?

a_psZemla LPD3DXBUFFER ?

b_psZemla dd ?

c_psZemla LPDIRECT3DVERTEXSHADER9 ?

.CODE

invoke D3DXAssembleShaderFromFileA, addr f_psZemla, 0, 0, D3DXSHADER_DEBUG, addr a_psZemla,0

.DATA

Z_psZemlaEER db "Create error Z_psZemla",0

.CODE

test eax, eax

jz @F

push OFFSET Z_psZemlaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psZemla

mov b_psZemla,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psZemla ,addr c_psZemla

.DATA

C_psZemlaEER db "Create error C_psZemla",0

.CODE

test eax, eax

jz @F

push OFFSET C_psZemlaEER

jmp Error_Message

@@:

ret

Init_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Set_Render_Parameters proc

d3dev9 SetRenderState, pd3dDevice, D3DRS_CULLMODE, D3DCULL_NONE

d3dev9 SetRenderState, pd3dDevice, D3DRS_ZENABLE,D3DZB_TRUE

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MAGFILTER, 0

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MINFILTER, 0

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC

ret

Set_Render_Parameters endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Render_Scene proc

.DATA

Zvalue dd 1.0f ; Значение для очистки Z буфера

Clearcolor dd 0 ; Цвет для очистки BackBuffer'а

.DATA?

.CODE

d3dev9 TestCooperativeLevel, pd3dDevice ; Проверка кооперации

cmp eax, D3DERR_DEVICELOST ; Если устройство потеряно то выход

jne noreset ;

invoke Destroy_Direct3D

jmp Exit ;

noreset: ;

cmp eax, D3DERR_DEVICENOTRESET ; Если устройство не потеряно и не сброшено то сбрасываем

jne noreset2 ;

d3dev9 Reset, pd3dDevice, ADDR BackBufferWidth ;

invoke Set_Render_Parameters

noreset2:

d3dev9 BeginScene, pd3dDevice

; подготовка данных

d3dev9 SetRenderTarget,pd3dDevice,0,CartoonRenP ; установка рендер таргетов

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenP

d3dev9 SetDepthStencilSurface,pd3dDevice,DepthTargP

d3dev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0 ; Очистка BackBuffer'а и Z-буфера

invoke D3DXMatrixMultiply, ADDR m_VS1 , ADDR WorldMatrix, ADDR ViewMatrix

invoke D3DXMatrixMultiply, ADDR m_VS1, ADDR m_VS1, ADDR ProjectionMatrix

invoke D3DXMatrixTranspose , ADDR m_VS1, ADDR m_VS1

d3dev9 SetTexture, pd3dDevice, 0, tefectP

; Отрисовка земли

d3dev9 SetVertexShader,pd3dDevice,c_vsZemla

d3dev9 SetPixelShader,pd3dDevice,c_psZemla

d3dev9 SetVertexShaderConstantF,pd3dDevice,0, addr m_VS1 , 4 ;c0

d3dev9 SetVertexShaderConstantF,pd3dDevice,4, addr PosLight , 1 ;c4

d3dev9 SetFVF, pd3dDevice, zemlaPT

d3dev9 SetStreamSource, pd3dDevice, 0 , zemlaP_VB, 0, zemlaPB

d3dev9 SetIndices, pd3dDevice, zemlaP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,zemlaP_NV,0,zemlaP_NF

; Отрисовка солнца

d3dev9 SetVertexShader,pd3dDevice,c_vsSun

d3dev9 SetPixelShader,pd3dDevice,c_psSun

d3dev9 SetFVF, pd3dDevice, neboPT

d3dev9 SetStreamSource, pd3dDevice, 0 , neboP_VB, 0, neboPB

d3dev9 SetIndices, pd3dDevice, neboP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка камня

d3dev9 SetVertexShader,pd3dDevice,c_vsKamen

d3dev9 SetPixelShader,pd3dDevice,c_psKamen

d3dev9 SetFVF, pd3dDevice, kamenPT

d3dev9 SetStreamSource, pd3dDevice, 0 , kamenP_VB, 0, kamenPB

d3dev9 SetIndices, pd3dDevice, kamenP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,kamenP_NV,0,kamenP_NF

; Отрисовка пальм

d3dev9 SetPixelShader,pd3dDevice,c_psPalma

d3dev9 SetFVF, pd3dDevice, palmiPT

d3dev9 SetStreamSource, pd3dDevice, 0 , palmiP_VB, 0, palmiPB

d3dev9 SetIndices, pd3dDevice, palmiP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,palmiP_NV,0,palmiP_NF

; Отрисовка неба

d3dev9 SetRenderTarget,pd3dDevice,1,0

d3dev9 SetVertexShader,pd3dDevice,c_vsNebo

d3dev9 SetPixelShader,pd3dDevice,c_psNebo

d3dev9 SetFVF, pd3dDevice, neboPT

d3dev9 SetStreamSource, pd3dDevice, 0 , neboP_VB, 0, neboPB

d3dev9 SetIndices, pd3dDevice, neboP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка воды

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenP

d3dev9 SetVertexShader,pd3dDevice,c_vsWater

d3dev9 SetPixelShader,pd3dDevice,c_psWater

d3dev9 SetFVF, pd3dDevice, wodaPT

d3dev9 SetStreamSource, pd3dDevice, 0 , wodaP_VB, 0, wodaPB

d3dev9 SetIndices, pd3dDevice, wodaP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,wodaP_NV,0,wodaP_NF

; смешивание

d3dev9 SetRenderTarget,pd3dDevice,0, BackBufferP

d3dev9 SetRenderTarget,pd3dDevice,1, 0

d3dev9 SetDepthStencilSurface,pd3dDevice,ZStenBackBufferP

d3dev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0 ; Очистка BackBuffer'а и Z-буфера

d3dev9 SetVertexShader,pd3dDevice,c_vsEkran

d3dev9 SetPixelShader,pd3dDevice,c_psEkran

d3dev9 SetTexture, pd3dDevice, 0, CartoonRen

d3dev9 SetTexture, pd3dDevice, 1, NormalRen

d3dev9 SetVertexShaderConstantF,pd3dDevice,3, addr SSViewProjection ,4

d3dev9 SetVertexShaderConstantF,pd3dDevice,7, addr SSP_XY_640_480 ,1

d3dev9 SetFVF, pd3dDevice, EkranPT

d3dev9 SetStreamSource, pd3dDevice, 0 , EkranP_VB, 0, EkranPB

d3dev9 SetIndices, pd3dDevice, EkranP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,EkranP_NV,0,EkranP_NF

d3dev9 EndScene, pd3dDevice

; Анимируем сцену

.DATA

RotZ dd 0.0f

Prib dd 0.002f

LightRot dd 0

LightPrib dd 0.01

kMoveLight dd 100000.0f

.CODE

fld RotZ

fadd Prib

fstp RotZ

fld LightRot

fadd LightPrib

fstp LightRot

fld LightRot

fsin

fmul kMoveLight

fstp PosLight.r

fld LightRot

fcos

fmul kMoveLight

fstp PosLight.g

invoke D3DXMatrixRotationY, ADDR WorldMatrix, RotZ

d3dev9 Present, pd3dDevice, NULL, NULL, NULL, NULL ; Вывод BackBuffer'а на экран

ret

Render_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Release_Object proc pointer:DWORD

mov eax, pointer

test eax, eax

jz @F

d3dev9 Release, eax

@@:

ret

Release_Object endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Destroy_Direct3D proc ; освобождение всех созданных объектов

;Шейдеры

invoke Release_Object, a_psZemla

invoke Release_Object, c_psZemla

invoke Release_Object, a_psWater

invoke Release_Object, c_psWater

invoke Release_Object, a_psSun

invoke Release_Object, c_psSun

invoke Release_Object, a_psPalma

invoke Release_Object, c_psPalma

invoke Release_Object, a_psNebo

invoke Release_Object, c_psNebo

invoke Release_Object, a_psKamen

invoke Release_Object, c_psKamen

invoke Release_Object, a_psEkran

invoke Release_Object, c_psEkran

invoke Release_Object, a_vsZemla

invoke Release_Object, c_vsZemla

invoke Release_Object, a_vsWater

invoke Release_Object, c_vsWater

invoke Release_Object, a_vsSun

invoke Release_Object, c_vsSun

invoke Release_Object, a_vsNebo

invoke Release_Object, c_vsNebo

invoke Release_Object, a_vsKamen

invoke Release_Object, c_vsKamen

invoke Release_Object, a_vsEkran

invoke Release_Object, c_vsEkran

;Модели

invoke Release_Object ,zemlaP_IB

invoke Release_Object, zemlaP_VB

invoke Release_Object, zemlaP

invoke Release_Object, wodaP_IB

invoke Release_Object, wodaP_VB

invoke Release_Object, wodaP

invoke Release_Object, palmiP_IB

invoke Release_Object, palmiP_VB

invoke Release_Object, palmiP

invoke Release_Object, neboP_IB

invoke Release_Object, neboP_VB

invoke Release_Object, neboP

invoke Release_Object, kamenP_IB

invoke Release_Object, kamenP_VB

invoke Release_Object, kamenP

invoke Release_Object, EkranP_IB

invoke Release_Object, EkranP_VB

invoke Release_Object, EkranP

;текстуры

invoke Release_Object, tefectP

;Таргеты

invoke Release_Object, NormalRenP

invoke Release_Object, CartoonRenP

invoke Release_Object, DepthTargP

invoke Release_Object, ZStenBackBufferP

invoke Release_Object,BackBufferP

mov eax,pd3dDevice

test eax, eax

jz @F

d3dev9 Release, eax

@@: ; Освобождение Direct3DDevice

mov eax,pd3d

test eax, eax

jz @F

d3dev9 Release, eax

@@: ; Освобождение Direct3D9

ret

Destroy_Direct3D endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Error_Message: ; Вывод сообщения об ошибке и завершение работы приложения

mov eax, DWORD PTR [esp]

invoke MessageBox, hwnd, eax, ADDR szAppName, MB_ICONERROR

pop eax

invoke Destroy_Direct3D

jmp Exit

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

end Start