74 lines
3.5 KiB
C
74 lines
3.5 KiB
C
// mesh_debug.c - 精确定位 mesh 系统 bug
|
|
#include "../Engine/Core/engine.h"
|
|
#include "../Engine/Window/window.h"
|
|
#include "../Engine/Rendering/graphics_device.h"
|
|
#include "../Engine/Rendering/shader.h"
|
|
#include "../Engine/include/engine_api.h"
|
|
#include "../Engine/ASM/math_c_fallback.h"
|
|
|
|
static GraphicsDevice* g_dev = NULL;
|
|
static Shader* g_shader = NULL;
|
|
static ID3D11Buffer* g_vb = NULL;
|
|
static ID3D11Buffer* g_ib = NULL;
|
|
|
|
typedef struct { float p[3],n[3],uv[2],c[4]; } V;
|
|
|
|
static void on_render(Engine* engine) {
|
|
if (!g_dev) return;
|
|
ID3D11DeviceContext* ctx = g_dev->context;
|
|
float sw=(float)g_dev->width, sh=(float)g_dev->height;
|
|
float fov=1.0f/tanf(0.4f), asp=sw/sh;
|
|
|
|
float mvp[16];
|
|
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.15f, 0.18f, 0.25f, 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);
|
|
shader_bind(g_shader, ctx);
|
|
shader_set_matrix(g_shader, ctx, (float*)&pt);
|
|
|
|
// 用 init 时创建的 VB 画
|
|
UINT stride=sizeof(V), offset=0;
|
|
ctx->lpVtbl->IASetVertexBuffers(ctx,0,1,&g_vb,&stride,&offset);
|
|
ctx->lpVtbl->IASetIndexBuffer(ctx,g_ib,DXGI_FORMAT_R32_UINT,0);
|
|
ctx->lpVtbl->DrawIndexed(ctx,6,0,0);
|
|
|
|
if(rs) rs->lpVtbl->Release(rs);
|
|
if(dss) dss->lpVtbl->Release(dss);
|
|
graphics_device_present(g_dev);
|
|
}
|
|
|
|
static void on_key(Engine* engine, int key) { if(key==VK_ESCAPE) engine_request_quit(engine); }
|
|
|
|
int WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) {
|
|
EngineConfig cfg=engine_default_config(); cfg.app_name="mesh debug";
|
|
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;
|
|
g_shader=shader_create(); shader_compile(g_shader,g_dev->device,NULL,NULL,0,0);
|
|
|
|
// WinMain 中创建 VB/IB(跟 mesh_create_cube 一样的时机)
|
|
V v[4]={{{-0.5f,-0.5f,0.5f},{0,0,1},{0,0},{1,0,0,1}},{{0.5f,-0.5f,0.5f},{0,0,1},{1,0},{0,1,0,1}},{{0.5f,0.5f,0.5f},{0,0,1},{1,1},{0,0,1,1}},{{-0.5f,0.5f,0.5f},{0,0,1},{0,1},{1,1,1,1}}};
|
|
uint32_t idx[6]={0,1,2,0,2,3};
|
|
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,&g_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,&g_ib);
|
|
|
|
engine_set_render_callback(e,on_render); engine_set_key_callback(e,on_key);
|
|
engine_run(e);
|
|
if(g_vb)g_vb->lpVtbl->Release(g_vb); if(g_ib)g_ib->lpVtbl->Release(g_ib);
|
|
shader_destroy(g_shader); graphics_device_destroy(g_dev); engine_shutdown(e);
|
|
return 0;
|
|
}
|