核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2) 外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言 含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
56 lines
1.8 KiB
C
56 lines
1.8 KiB
C
#include "renderer.h"
|
|
#include <stdlib.h>
|
|
|
|
Renderer* renderer_create(GraphicsDevice* device) {
|
|
Renderer* r = (Renderer*)calloc(1, sizeof(Renderer));
|
|
r->device = device;
|
|
mat4_identity(&r->view);
|
|
mat4_identity(&r->projection);
|
|
r->light_dir = (Vec3){0.5f, -1.0f, 0.3f};
|
|
r->light_color = (Vec4){1,1,1,1};
|
|
r->ambient_color = (Vec4){0.2f,0.2f,0.3f,1};
|
|
return r;
|
|
}
|
|
|
|
void renderer_destroy(Renderer* r) { free(r); }
|
|
|
|
void renderer_begin_frame(Renderer* r) {
|
|
graphics_device_clear(r->device, 0.1f, 0.1f, 0.15f, 1.0f);
|
|
}
|
|
|
|
void renderer_end_frame(Renderer* r) {
|
|
graphics_device_present(r->device);
|
|
}
|
|
|
|
void renderer_draw_mesh(Renderer* r, Mesh* m) {
|
|
if (!m) return;
|
|
ID3D11DeviceContext* ctx = r->device->context;
|
|
UINT stride = sizeof(Vertex);
|
|
UINT offset = 0;
|
|
ctx->lpVtbl->IASetVertexBuffers(ctx, 0, 1, &m->vb, &stride, &offset);
|
|
if (m->ib) {
|
|
ctx->lpVtbl->IASetIndexBuffer(ctx, m->ib, DXGI_FORMAT_R32_UINT, 0);
|
|
ctx->lpVtbl->DrawIndexed(ctx, m->icount, 0, 0);
|
|
} else {
|
|
ctx->lpVtbl->Draw(ctx, m->vcount, 0);
|
|
}
|
|
}
|
|
|
|
void renderer_draw_mesh_with_shader(Renderer* r, Mesh* m, Shader* s, const Mat4* world, Texture* t) {
|
|
if (!m || !s) return;
|
|
ID3D11DeviceContext* ctx = r->device->context;
|
|
shader_bind(s, ctx);
|
|
renderer_draw_mesh(r, m);
|
|
}
|
|
|
|
void renderer_set_view(Renderer* r, const Mat4* v) { r->view = *v; }
|
|
void renderer_set_projection(Renderer* r, const Mat4* p) { r->projection = *p; }
|
|
void renderer_set_light(Renderer* r, Vec3 d, Vec4 c, Vec4 a) { r->light_dir=d; r->light_color=c; r->ambient_color=a; }
|
|
GraphicsDevice* renderer_get_device(Renderer* r) { return r ? r->device : NULL; }
|
|
|
|
void renderer_resize(Renderer* r, int width, int height) {
|
|
if (r && r->device && width > 0 && height > 0) {
|
|
graphics_device_resize(r->device, width, height);
|
|
}
|
|
}
|