Files
lity3d/Demo/mesh_debug.c
T

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