// 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; }