1
0
Fork 0

Compare commits

..

No commits in common. "8b3da34d8c5777d8797088260ee2d5a455328594" and "3e2d0888481de91b4dfc52ee50aa84cb40c26326" have entirely different histories.

7 changed files with 25 additions and 28 deletions

View File

@ -226,9 +226,9 @@ For C/C++ files:
```c ```c
// Example: src/games/life/life.c // Example: src/games/life/life.c
void EXPORT(init, void); EXPORT(init) void init();
void EXPORT(frme, void); EXPORT(step) void step();
int EXPORT(getCell, int x, int y); EXPORT(getCell) int getCell(int x, int y);
// Must export memory // Must export memory
``` ```

View File

@ -1,10 +1,6 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <js.h>
#define GRAPHICS_INIT image_data_t* EXPORT(canvas_init, void)
#define GRAPHICS_FRAME void EXPORT(canvas_frame, void)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#define IMPORT(name) __attribute__((import_module("env"), import_name(#name))) #define IMPORT(name) __attribute__((import_module("env"), import_name(#name)))
#define EXPORT_NAME(name) __attribute__((export_name(#name))) #define EXPORT(name) __attribute__((export_name(#name)))
#define EXPORT(name, ...) EXPORT_NAME(name) name(__VA_ARGS__)
IMPORT(log) int console_log(const char* format, ...);

View File

@ -30,21 +30,21 @@ export function createCanvas(width: number, height: number) {
interface WasmModule { interface WasmModule {
data: DataView; data: DataView;
canvas_init?: (width: number, height: number) => number; init?: (width: number, height: number) => number;
canvas_frame?: () => void; frame?: () => void;
} }
export function createWasmCanvas(module: WasmModule, width: number = 0, height: number = 0) { export function createWasmCanvas(module: WasmModule, width: number = 0, height: number = 0) {
const pointer = module.canvas_init?.(width, height); const pointer = module.init?.(width, height);
if (pointer) { if (pointer) {
const imageData = loadImageData(module.data, pointer); const imageData = loadImageData(module.data, pointer);
const canvas = createCanvas(imageData.width, imageData.height); const canvas = createCanvas(imageData.width, imageData.height);
const context = canvas.getContext('2d'); const context = canvas.getContext('2d');
if (context && typeof module.canvas_frame === 'function') { if (context) {
const frame = () => { const frame = () => {
module.canvas_frame?.(); module.frame?.();
context.putImageData(imageData, 0, 0); context.putImageData(imageData, 0, 0);
requestAnimationFrame(frame); requestAnimationFrame(frame);
}; };

View File

@ -51,7 +51,7 @@ static rigid_body_collision_callback_t rigid_body_collision_callback = NULL;
////////// Functions ////////// Functions
EXPORT_NAME(rigid_body_get) rigid_body* _rigid_body_get(rigid_body_index idx) { EXPORT(rigid_body_get) rigid_body* _rigid_body_get(rigid_body_index idx) {
return rigid_body_get(idx); return rigid_body_get(idx);
} }
@ -74,7 +74,7 @@ size_t rigid_body_new(float x, float y, float vx, float vy, float mass) {
return idx; return idx;
} }
rigid_body_index EXPORT(rigid_body_new_circle, float x, float y, float vx, float vy, float mass, float radius) { EXPORT(rigid_body_new_circle) rigid_body_index rigid_body_new_circle(float x, float y, float vx, float vy, float mass, float radius) {
rigid_body_index idx = rigid_body_new(x, y, vx, vy, mass); rigid_body_index idx = rigid_body_new(x, y, vx, vy, mass);
rigid_body* rb = rigid_body_get(idx); rigid_body* rb = rigid_body_get(idx);
@ -84,7 +84,7 @@ rigid_body_index EXPORT(rigid_body_new_circle, float x, float y, float vx, float
return idx; return idx;
} }
rigid_body_index EXPORT(rigid_body_new_plane, float x, float y, float nx, float ny) { EXPORT(rigid_body_new_plane) rigid_body_index rigid_body_new_plane(float x, float y, float nx, float ny) {
rigid_body_index idx = rigid_body_new(x, y, 0, 0, INFINITY); rigid_body_index idx = rigid_body_new(x, y, 0, 0, INFINITY);
rigid_body* rb = rigid_body_get(idx); rigid_body* rb = rigid_body_get(idx);
@ -94,11 +94,11 @@ rigid_body_index EXPORT(rigid_body_new_plane, float x, float y, float nx, float
return idx; return idx;
} }
void EXPORT(rigid_body_free, rigid_body_index idx) { EXPORT(rigid_body_free) void rigid_body_free(rigid_body_index idx) {
memset(rigid_body_get(idx), 0, sizeof(rigid_body)); memset(rigid_body_get(idx), 0, sizeof(rigid_body));
} }
void EXPORT(rigid_body_update, rigid_body_index idx, float dt) { EXPORT(rigid_body_update) void rigid_body_update(rigid_body_index idx, float dt) {
rigid_body_resolve_collision(idx); rigid_body_resolve_collision(idx);
rigid_body* rb = rigid_body_get(idx); rigid_body* rb = rigid_body_get(idx);
@ -114,7 +114,7 @@ void EXPORT(rigid_body_update, rigid_body_index idx, float dt) {
rb->force.y = 0; rb->force.y = 0;
} }
void EXPORT(rigid_body_update_all, float dt) { EXPORT(rigid_body_update_all) void rigid_body_update_all(float dt) {
for (rigid_body_index idx = 0; idx < rigid_bodies_cap; idx++) { for (rigid_body_index idx = 0; idx < rigid_bodies_cap; idx++) {
rigid_body* current = rigid_body_get(idx); rigid_body* current = rigid_body_get(idx);
if (current->type == TYPE_EMPTY) { if (current->type == TYPE_EMPTY) {
@ -124,13 +124,13 @@ void EXPORT(rigid_body_update_all, float dt) {
} }
} }
void EXPORT(rigid_body_add_force, rigid_body_index idx, float fx, float fy) { EXPORT(rigid_body_add_force) void rigid_body_add_force(rigid_body_index idx, float fx, float fy) {
rigid_body* rb = rigid_body_get(idx); rigid_body* rb = rigid_body_get(idx);
rb->force.x += fx; rb->force.x += fx;
rb->force.y += fy; rb->force.y += fy;
} }
void EXPORT(rigid_body_add_global_force, float fx, float fy) { EXPORT(rigid_body_add_global_force) void rigid_body_add_global_force(float fx, float fy) {
for (rigid_body_index idx = 0; idx < rigid_bodies_cap; idx++) { for (rigid_body_index idx = 0; idx < rigid_bodies_cap; idx++) {
rigid_body* current = rigid_body_get(idx); rigid_body* current = rigid_body_get(idx);
if (current->type == TYPE_EMPTY) { if (current->type == TYPE_EMPTY) {
@ -140,7 +140,7 @@ void EXPORT(rigid_body_add_global_force, float fx, float fy) {
} }
} }
void EXPORT(rigid_body_set_collision_callback, rigid_body_collision_callback_t callback) { EXPORT(rigid_body_set_collision_callback) void rigid_body_set_collision_callback(rigid_body_collision_callback_t callback) {
rigid_body_collision_callback = callback; rigid_body_collision_callback = callback;
} }

View File

@ -1,5 +1,5 @@
#include <graphics.h>
#include <js.h> #include <js.h>
#include <graphics.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
@ -12,7 +12,7 @@ static image_data_t image_data;
static int count_neighbours(int x, int y); static int count_neighbours(int x, int y);
GRAPHICS_FRAME { EXPORT(frame) void frame(void) {
for (int y = 0; y < HEIGHT; y++) { for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) { for (int x = 0; x < WIDTH; x++) {
int count = count_neighbours(x, y); int count = count_neighbours(x, y);
@ -59,7 +59,7 @@ static int count_neighbours(int x, int y) {
return count; return count;
} }
GRAPHICS_INIT { EXPORT(init) image_data_t* init(void) {
field = malloc(WIDTH * HEIGHT); field = malloc(WIDTH * HEIGHT);
next_field = malloc(WIDTH * HEIGHT); next_field = malloc(WIDTH * HEIGHT);
image_data = image_create(WIDTH, HEIGHT); image_data = image_create(WIDTH, HEIGHT);

View File

@ -77,7 +77,7 @@ constexpr bit bit::nor(const bit& a, const bit& b) {
return result; return result;
} }
uint64_t EXPORT(awoo) { uint64_t awoo() {
bit a{1, "a"}; bit a{1, "a"};
bit b{1, "b"}; bit b{1, "b"};
@ -88,7 +88,7 @@ uint64_t EXPORT(awoo) {
return sum; return sum;
} }
void EXPORT(play) { EXPORT(play) void play() {
auto awoo = std::format("{2} {1}{0}!\n", 23, "C++", "Hello"); auto awoo = std::format("{2} {1}{0}!\n", 23, "C++", "Hello");
std::puts(awoo.c_str()); std::puts(awoo.c_str());
} }