#include "SFunction.h"
#include "Dscene.h"
#include "resource.h"
SFunction St;
#define D3DFVF_LINES (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct FLOOR
{
FLOAT x,y,z;
DWORD color;
};
Dscene::Dscene()
{
d3dDevice = NULL;
d3d = NULL;
ZeroMemory(&FontPosition,sizeof(FontPosition));
ZeroMemory(&FontPosition2,sizeof(FontPosition2));
Texture = NULL;
d3dVBuffer = NULL;
Font = NULL;
wor=0;
}
void Dscene::View()
{
D3DXMATRIXA16 matProjection;
D3DXMatrixPerspectiveFovLH(&matProjection, 45.0f, (float)St.Width/(float)St.Height, 0.1f, 500000.0f ); Width и Height вообще не когда не бурут новые значения из класса SFunction
if(d3dDevice)
d3dDevice->SetTransform( D3DTS_PROJECTION, &matProjection );
}
void Dscene::DeviceState()
{
d3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
d3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
d3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, NULL );
d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
d3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
}
HRESULT Dscene::InitGeometry()
{
if (FAILED(d3dDevice->CreateVertexBuffer(64*sizeof(FLOOR),0,D3DFVF_LINES,
D3DPOOL_MANAGED,&d3dVBuffer,NULL)))
{
return E_FAIL;
}
VOID *verter;
if(FAILED(d3dVBuffer->Lock(0,sizeof(verter),(void**)&verter,0)))
return E_FAIL;
memcpy(verter,Lines,sizeof(Lines));
d3dVBuffer->Unlock();
return S_OK;
}
void Dscene::checkp(bool keys[256])
{
if (keys['P'] && !St.lr) -------->Здесь пришлось загонять через функцию так как он не берёт новое значение переменной keys. Вопрос почему ?
{
St.lr = true;
St.tr = true;
if(wor==3)
{
wor=0;
}
if(St.tr)
{
wor+=1;
}
St.tr = false;
}
if (!keys['P'])
{
St.lr = false;
}
}
D3DXVECTOR3 g_vEye(-80.0f, 80.0f, -80.0f);
D3DXVECTOR3 g_vLook(0.1f, -0.06f, 0.10f);
D3DXVECTOR3 g_vUp(0.0f, 1.0f, 0.0f);
D3DXVECTOR3 g_vRight(0.0f, 0.0f, 0.0f);
void Dscene::updateViewMatrix()
{
D3DXMATRIX view;
D3DXMatrixIdentity( &view );
D3DXVec3Normalize( &g_vLook, &g_vLook );
D3DXVec3Cross( &g_vRight, &g_vUp, &g_vLook );
D3DXVec3Normalize( &g_vRight, &g_vRight );
D3DXVec3Cross( &g_vUp, &g_vLook, &g_vRight );
D3DXVec3Normalize( &g_vUp, &g_vUp );
view._11 = g_vRight.x;
view._12 = g_vUp.x;
view._13 = g_vLook.x;
view._14 = 0.0f;
view._21 = g_vRight.y;
view._22 = g_vUp.y;
view._23 = g_vLook.y;
view._24 = 0.0f;
view._31 = g_vRight.z;
view._32 = g_vUp.z;
view._33 = g_vLook.z;
view._34 = 0.0f;
view._41 = -D3DXVec3Dot( &g_vEye, &g_vRight );
view._42 = -D3DXVec3Dot( &g_vEye, &g_vUp );
view._43 = -D3DXVec3Dot( &g_vEye, &g_vLook );
view._44 = 1.0f;
d3dDevice->SetTransform( D3DTS_VIEW, &view );
}
void Dscene::getRealTimeUserInput(int w, int h,bool keys[256],bool clip,float Move)
{
POINT mousePosit;
GetCursorPos( &mousePosit );
int yDirection = (w - mousePosit.x);
int yRotation = (h - mousePosit.y);
D3DXMATRIX matRotation;
D3DXMatrixRotationAxis( &matRotation, &g_vRight, D3DXToRadian((float)-yRotation / 3.0f));
D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );
D3DXMatrixRotationAxis( &matRotation, &D3DXVECTOR3(0,1,0), D3DXToRadian((float)-yDirection / 3.0f) );
D3DXVec3TransformCoord( &g_vLook, &g_vLook, &matRotation );
D3DXVec3TransformCoord( &g_vUp, &g_vUp, &matRotation );
if( keys[VK_UP] )
g_vEye -= g_vLook*-Move;
if( keys[VK_DOWN])
g_vEye += (g_vLook*-Move);
if( keys[VK_LEFT] )
g_vEye -= (g_vRight*Move);
if( keys[VK_RIGHT] )
g_vEye += (g_vRight*Move);
if( keys[VK_HOME] )
g_vEye.y += Move;
if( keys[VK_END] )
g_vEye.y -= Move;
if (St.clip)----- Здесь так вообще он не когда не обновляет значение хоть в класс SFunction меняй и не меняй значения.
{
SetCursorPos(w, h);
}
}
void Dscene::invalidateDeviceObjects(RECT rc1)
{
if(Font!=NULL)
Font->Release();
d3dpp.BackBufferWidth = rc1.right - rc1.left;
d3dpp.BackBufferHeight = rc1.bottom - rc1.top;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
HRESULT hr = d3dDevice->Reset( &d3dpp );
if( hr == D3DERR_INVALIDCALL )
{
MessageBox( NULL, "Невозможно обновить сцену","ERROR", MB_OK | MB_ICONEXCLAMATION );
}
View();
D3DXCreateFont(d3dDevice, 15, 0, 0, 1, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE, "Arial", &Font);
DeviceState();
}