#include "../Common/def.h" #include "../Common/gem.h" #include "../Common/std.h" #include "../Common/time.h" #include #if COM_DEF_TARGET == COM_DEF_TARGET_WASM uint8_t plr_draw_buffer[640 * 480 * 4]; com_def_export_sym( "plr_draw_get_pixel_buffer") uint8_t *plr_draw_get_pixel_buffer(void) { return plr_draw_buffer; } #endif com_def_export_sym("plr_draw_screen") void plr_draw_screen( uint8_t *pixel_buffer) { for (int y = 0; y < 480; y++) { for (int x = 0; x < 640; x++) { int pixel_index = (y * 640 + x) * 4; // Assuming standard Little-Endian 32-bit BGRA format pixel_buffer[pixel_index + 0] = (x) % 256; // Blue pixel_buffer[pixel_index + 1] = (y) % 256; // Green pixel_buffer[pixel_index + 2] = (x + y) % 256; // Red pixel_buffer[pixel_index + 3] = 255; // Alpha/Padding } } com_mat_t proj = com_mat_perspective(640, 480, 1, 100 * COM_FIX_FRACUNIT, COM_FIX_PIHALF); com_mat_t view = com_mat_look_at(com_vec_from(0, 0, 0), com_vec_from(0, COM_FIX_FRACUNIT, 0), com_vec_from(-COM_FIX_FRACUNIT, 0, 0)); com_mat_t mvp = com_mat_reoder(com_mat_mul(proj, view)); com_vec_t v0 = com_vec_from(0 * COM_FIX_FRACUNIT, 0, 1 * COM_FIX_FRACUNIT); com_vec_t v1 = com_vec_from(1 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT); com_vec_t v2 = com_vec_from(1 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT); com_vec_t v3 = com_vec_from(1 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT, -1 * COM_FIX_FRACUNIT); com_pnt_t uv0 = com_pnt_from(0 * COM_FIX_FRACUNIT, 0 * COM_FIX_FRACUNIT); com_pnt_t uv1 = com_pnt_from(1 * COM_FIX_FRACUNIT, 0 * COM_FIX_FRACUNIT); com_pnt_t uv2 = com_pnt_from(1 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT); com_pnt_t uv3 = com_pnt_from(0 * COM_FIX_FRACUNIT, 1 * COM_FIX_FRACUNIT); com_vec_t c0 = com_gem_vec_project_clip(mvp, v0); com_vec_t c1 = com_gem_vec_project_clip(mvp, v1); com_vec_t c2 = com_gem_vec_project_clip(mvp, v2); com_vec_t c3 = com_gem_vec_project_clip(mvp, v3); com_pnt_t p0, p1, p2, p3; uint8_t cc0 = com_gem_clip_vis_project(c0, &p0); uint8_t cc1 = com_gem_clip_vis_project(c1, &p1); uint8_t cc2 = com_gem_clip_vis_project(c2, &p2); uint8_t cc3 = com_gem_clip_vis_project(c3, &p3); com_std_printf("%i, %i\n", p0.a[0], p0.a[1]); com_std_printf("%i, %i\n", p1.a[0], p1.a[1]); com_std_printf("%i, %i\n", p2.a[0], p2.a[1]); com_std_printf("%i, %i\n", p3.a[0], p3.a[1]); uint8_t tex[32 * 32 * 3] = {0}; for (int y = 0; y < 32; ++y) { for (int x = 0; x < 32; ++x) { // uint32_t idx = com_zord_order(x, y); uint32_t idx = y * 32 + x; tex[idx * 3 + 0] = (x / 2 + y / 2) % 2 == 0 ? 175 : 0; tex[idx * 3 + 1] = (x / 2 + y / 2) % 2 == 0 ? 0 : 0; tex[idx * 3 + 2] = (x / 2 + y / 2) % 2 == 0 ? 175 : 0; } } uint64_t time = com_timer_count_ns(); for (int i = 5000; i--;) { // com_gem_draw_triangle_textured_edge(p0, p1, p2, (uint8_t *)pixel_buffer, // uv0, uv1, uv2, tex); // com_gem_draw_triangle_textured_span(p0, p1, p3, (uint8_t *)pixel_buffer, // uv0, uv1, uv3, tex); } com_timer_profile(time, "textured triangle"); }