#include "../Engine/Core/engine.h" #include "../Engine/Window/window.h" #include "../Engine/Rendering/graphics_device.h" #include "../Engine/include/engine_api.h" #include "../Engine/ASM/math_c_fallback.h" #include static GraphicsDevice* g_dev = NULL; static ID3D11VertexShader* g_vs = NULL; static ID3D11PixelShader* g_ps = NULL; static ID3D11InputLayout* g_il = NULL; static ID3D11Buffer* g_cb = NULL; static float cam_x=0, cam_z=2, cam_yaw=0; static float mx=0, my=0; static int keys[256]={0}; typedef struct { float p[3],n[3],uv[2],c[4]; } V; static void draw_quad(ID3D11DeviceContext* ctx, float x, float y, float z, float s, float r, float g, float b) { V v[4]={{{x-s,y-s,z},{0,0,-1},{0,0},{r,g,b,1}},{{x+s,y-s,z},{0,0,-1},{1,0},{r,g,b,1}}, {{x+s,y+s,z},{0,0,-1},{1,1},{r,g,b,1}},{{x-s,y+s,z},{0,0,-1},{0,1},{r,g,b,1}}}; uint32_t idx[6]={0,1,2,0,2,3}; ID3D11Buffer *vb=NULL,*ib=NULL; D3D11_BUFFER_DESC bd={}; D3D11_SUBRESOURCE_DATA sd={}; bd.ByteWidth=sizeof(V)*4; bd.Usage=D3D11_USAGE_DEFAULT; bd.BindFlags=D3D11_BIND_VERTEX_BUFFER; sd.pSysMem=v; g_dev->device->lpVtbl->CreateBuffer(g_dev->device,&bd,&sd,&vb); bd.ByteWidth=sizeof(uint32_t)*6; bd.BindFlags=D3D11_BIND_INDEX_BUFFER; sd.pSysMem=idx; g_dev->device->lpVtbl->CreateBuffer(g_dev->device,&bd,&sd,&ib); UINT s2=sizeof(V),o=0; ctx->lpVtbl->IASetVertexBuffers(ctx,0,1,&vb,&s2,&o); ctx->lpVtbl->IASetIndexBuffer(ctx,ib,DXGI_FORMAT_R32_UINT,0); ctx->lpVtbl->DrawIndexed(ctx,6,0,0); ib->lpVtbl->Release(ib); vb->lpVtbl->Release(vb); } static void on_render(Engine* engine) { if(!g_dev) return; ID3D11DeviceContext* ctx=g_dev->context; float dt=(float)engine->delta_time, sp=3.0f*dt; float fx=-sinf(cam_yaw),fz=-cosf(cam_yaw),rx=cosf(cam_yaw),rz=-sinf(cam_yaw); if(keys['W']){cam_x+=fx*sp;cam_z+=fz*sp;} if(keys['S']){cam_x-=fx*sp;cam_z-=fz*sp;} if(keys['A']){cam_x-=rx*sp;cam_z-=rz*sp;} if(keys['D']){cam_x+=rx*sp;cam_z+=rz*sp;} float sw=(float)g_dev->width,sh=(float)g_dev->height; float fov=1.0f/tanf(0.4f),asp=sw/sh; float mvp[16]={0}; mvp[0]=fov/asp;mvp[5]=-fov;mvp[10]=1;mvp[11]=-1;mvp[14]=0.1f;mvp[15]=1; Mat4 pm,pt;memcpy(&pm,mvp,sizeof(Mat4));mat4_transpose(&pm,&pt); graphics_device_clear(g_dev,0.12f,0.14f,0.18f,1.0f); D3D11_VIEWPORT vp={};vp.Width=sw;vp.Height=sh;vp.MaxDepth=1; ctx->lpVtbl->RSSetViewports(ctx,1,&vp); D3D11_RASTERIZER_DESC rd={};rd.FillMode=D3D11_FILL_SOLID;rd.CullMode=D3D11_CULL_NONE; ID3D11RasterizerState*rs=NULL;g_dev->device->lpVtbl->CreateRasterizerState(g_dev->device,&rd,&rs); ctx->lpVtbl->RSSetState(ctx,rs); D3D11_DEPTH_STENCIL_DESC dsd={};dsd.DepthEnable=FALSE; ID3D11DepthStencilState*dss=NULL;g_dev->device->lpVtbl->CreateDepthStencilState(g_dev->device,&dsd,&dss); ctx->lpVtbl->OMSetDepthStencilState(ctx,dss,0); ctx->lpVtbl->IASetPrimitiveTopology(ctx,D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); ctx->lpVtbl->VSSetShader(ctx,g_vs,NULL,0);ctx->lpVtbl->PSSetShader(ctx,g_ps,NULL,0); ctx->lpVtbl->IASetInputLayout(ctx,g_il);ctx->lpVtbl->VSSetConstantBuffers(ctx,0,1,&g_cb); ctx->lpVtbl->UpdateSubresource(ctx,(ID3D11Resource*)g_cb,0,NULL,&pt,0,0); for(int x=-5;x<=5;x++)for(int z=-5;z<=5;z++){float c=((x+z)%2==0)?.4f:.3f;draw_quad(ctx,(float)x,(float)z,0.5f,0.5f,c,c,c);} draw_quad(ctx,0,0,0.5f,0.4f,1,0.3f,0.3f);draw_quad(ctx,2,0,0.5f,0.3f,.3f,1,.3f);draw_quad(ctx,-2,0,0.5f,0.3f,.3f,.3f,1);draw_quad(ctx,0,2,0.5f,0.5f,.8f,.8f,.2f); if(rs)rs->lpVtbl->Release(rs);if(dss)dss->lpVtbl->Release(dss); graphics_device_present(g_dev); } static void on_key(Engine*e,int k){if(k>=0&&k<256)keys[k]=1;if(k==VK_ESCAPE)engine_request_quit(e);} static void on_mouse_move(int x,int y){cam_yaw+=(x-mx)*0.003f;mx=(float)x;my=(float)y;} int WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int){ EngineConfig cfg=engine_default_config();cfg.app_name="lity3d Input Test"; Engine*e=engine_create();if(!engine_init(e,&cfg))return -1; g_dev=graphics_device_create(); if(!graphics_device_init(g_dev,window_get_handle(e->window),cfg.window_width,cfg.window_height,1))return -1; ID3DBlob*b1=NULL,*b2=NULL,*er=NULL; const char*vs="cbuffer CB:register(b0){float4x4 WVP;};struct I{float3 p:POSITION;float3 n:NORMAL;float2 u:TEXCOORD;float4 c:COLOR;};struct O{float4 p:SV_POSITION;float3 n:NORMAL;float4 c:COLOR;};O main(I i){O o;o.p=mul(float4(i.p,1),WVP);o.n=i.n;o.c=i.c;return o;}"; const char*ps="struct O{float4 p:SV_POSITION;float3 n:NORMAL;float4 c:COLOR;};float4 main(O i){return i.c;}"; D3DCompile(vs,(UINT)strlen(vs),NULL,NULL,NULL,"main","vs_5_0",0,0,&b1,&er);if(er){er->lpVtbl->Release(er);er=NULL;} D3DCompile(ps,(UINT)strlen(ps),NULL,NULL,NULL,"main","ps_5_0",0,0,&b2,&er);if(er){er->lpVtbl->Release(er);er=NULL;} ID3D11Device*dev=g_dev->device; dev->lpVtbl->CreateVertexShader(dev,b1->lpVtbl->GetBufferPointer(b1),b1->lpVtbl->GetBufferSize(b1),NULL,&g_vs); dev->lpVtbl->CreatePixelShader(dev,b2->lpVtbl->GetBufferPointer(b2),b2->lpVtbl->GetBufferSize(b2),NULL,&g_ps); D3D11_INPUT_ELEMENT_DESC il[]={{"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},{"NORMAL",0,DXGI_FORMAT_R32G32B32_FLOAT,0,12,D3D11_INPUT_PER_VERTEX_DATA,0},{"TEXCOORD",0,DXGI_FORMAT_R32G32_FLOAT,0,24,D3D11_INPUT_PER_VERTEX_DATA,0},{"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT,0,32,D3D11_INPUT_PER_VERTEX_DATA,0}}; dev->lpVtbl->CreateInputLayout(dev,il,4,b1->lpVtbl->GetBufferPointer(b1),b1->lpVtbl->GetBufferSize(b1),&g_il);b1->lpVtbl->Release(b1);b2->lpVtbl->Release(b2); D3D11_BUFFER_DESC cbd={};cbd.ByteWidth=256;cbd.Usage=D3D11_USAGE_DEFAULT;cbd.BindFlags=D3D11_BIND_CONSTANT_BUFFER;dev->lpVtbl->CreateBuffer(dev,&cbd,NULL,&g_cb); window_set_key_callback(e->window,on_key);window_set_mouse_move_callback(e->window,on_mouse_move); engine_set_render_callback(e,on_render);engine_run(e); if(g_vs)g_vs->lpVtbl->Release(g_vs);if(g_ps)g_ps->lpVtbl->Release(g_ps);if(g_il)g_il->lpVtbl->Release(g_il);if(g_cb)g_cb->lpVtbl->Release(g_cb); graphics_device_destroy(g_dev);engine_shutdown(e);return 0; }