diff options
-rw-r--r-- | src/physics.c | 57 | ||||
-rw-r--r-- | src/physics.h | 1 | ||||
-rw-r--r-- | src/renderer.c | 13 | ||||
-rw-r--r-- | src/renderer.h | 6 | ||||
-rw-r--r-- | src/ui.c | 11 |
5 files changed, 57 insertions, 31 deletions
diff --git a/src/physics.c b/src/physics.c index 3981258..04c655c 100644 --- a/src/physics.c +++ b/src/physics.c @@ -34,6 +34,8 @@ void phy_sim_reset(phy_sim *sim) sim->time = 0; sim->running = false; + + sim->frame_index = get_time(); } int phy_sim_create(phy_sim *sim) @@ -45,8 +47,8 @@ int phy_sim_create(phy_sim *sim) fi = &sim->field_info; - fi->width = 100; - fi->height = 100; + fi->width = 50; + fi->height = 50; fi->depth = 50; fi->spacing = 1.5e10f / max3(fi->width, fi->height, fi->depth); sim->time_delta = 0.1; @@ -171,45 +173,58 @@ void phy_sim_step_H(phy_field_info *fi, float *mul_const, float dt, } } -void phy_sim_add_sources(phy_sim *sim) +void phy_sim_add_sources_E(phy_sim *sim) { phy_field_info *fi = &sim->field_info; float *E; size_t x, y, z; - for (z = 1; z < fi->depth - 1; z++) - for (y = 15; y < fi->height - 15; y++) - for (x = 1; x < fi->width - 1; x++) { - float s; + x = fi->width / 2; + y = fi->height / 2; + z = fi->depth / 2; - E = sim->fields[2].E + z * fi->zstr + y * fi->ystr + x * fi->xstr; + E = sim->fields[2].E + z * fi->zstr + y * fi->ystr + x * fi->xstr; + E[0] += exp(-0.1f * pow(sim->time - 5.0f, 2)) * 5; +} - s = exp(-600.0f * pow((float)x / fi->width - 0.15f, 2)); - s *= sin(sim->time); - //s *= exp(-2.0f * pow(sim->time - 2.0f, 2)) * 1000; - E[0] += s; - } +void phy_sim_add_sources_H(phy_sim *sim) +{ + phy_field_info *fi = &sim->field_info; + float *H; + size_t x, y, z; + + x = fi->width / 2; + y = fi->height / 2; + z = fi->depth / 2; + + H = sim->fields[2].H + z * fi->zstr + y * fi->ystr + x * fi->xstr; + H[1] -= exp(-0.1f * pow(sim->time - 4.5f, 2)) * 5; } void phy_sim_step(phy_sim *sim) { phy_field_info *fi = &sim->field_info; phy_field_em *fields = sim->fields, tmp; - // note: only pointers are rotated, not the entire fields + + phy_sim_step_E(fi, sim->field_mu, sim->time_delta, + fields[2].E, fields[0].E, fields[1].H); + phy_sim_add_sources_E(sim); + phy_sim_step_H(fi, sim->field_eps, sim->time_delta, + fields[2].H, fields[0].H, fields[1].E); + phy_sim_add_sources_H(sim); + SDL_mutexP(sim->rotate_lock); + + // note: only pointers are rotated, not the entire fields memcpy(&tmp, fields, sizeof(phy_field_em)); memcpy(fields, fields + 1, sizeof(phy_field_em)); memcpy(fields + 1, fields + 2, sizeof(phy_field_em)); memcpy(fields + 2, &tmp, sizeof(phy_field_em)); - SDL_mutexV(sim->rotate_lock); + sim->time += sim->time_delta; - phy_sim_step_H(fi, sim->field_eps, sim->time_delta, - fields[2].H, fields[0].H, fields[1].E); - phy_sim_step_E(fi, sim->field_mu, sim->time_delta, - fields[2].E, fields[0].E, fields[1].H); - phy_sim_add_sources(sim); + sim->frame_index = get_time(); - sim->time += sim->time_delta; + SDL_mutexV(sim->rotate_lock); } void phy_run_command(phy_sim *sim, int number, void *data) diff --git a/src/physics.h b/src/physics.h index 92ec6fd..1ce2a9c 100644 --- a/src/physics.h +++ b/src/physics.h @@ -35,6 +35,7 @@ typedef struct { bool running; itc_chan ctl; SDL_mutex *rotate_lock; + int64_t frame_index; // to avoid re-drawing the same fields } phy_sim; void phy_sim_destroy(phy_sim *sim); diff --git a/src/renderer.c b/src/renderer.c index 3c403a0..fb1647b 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -360,13 +360,21 @@ void r_xsection_destroy(r_xsection *xsection) } int r_xsection_update(r_window *rw, r_xsection *xsection, - phy_field_info *fi, float *field, + phy_field_info *fi, float *field, int64_t frame_index, r_xsection_type type, float frac) { size_t width, height, x, y, z; uint8_t *pixels; int pitch; + if (xsection->frame_index && + xsection->frame_index == frame_index && + xsection->last_frac == frac && + xsection->last_type == type) + return 0; // nothing's changed + + printf("r_xsection_update: tick %ld\n", frame_index); + switch (type) { case XSECTION_XY: width = fi->width; @@ -462,6 +470,9 @@ int r_xsection_update(r_window *rw, r_xsection *xsection, xsection->aspect_ratio = (float)width / height; + xsection->last_frac = frac; + xsection->last_type = type; + xsection->frame_index = frame_index; return 0; } diff --git a/src/renderer.h b/src/renderer.h index 0c38e6d..ce373df 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -49,12 +49,16 @@ typedef enum { typedef struct { SDL_Texture *texture; float aspect_ratio; + + r_xsection_type last_type; + float last_frac; + int64_t frame_index; } r_xsection; void r_xsection_create(r_xsection *xsection); void r_xsection_destroy(r_xsection *xsection); int r_xsection_update(r_window *rw, r_xsection *xsection, - phy_field_info *fi, float *field, + phy_field_info *fi, float *field, int64_t frame_index, r_xsection_type type, float frac); void r_xsection_draw(r_window *rw, r_xsection *xsection, float x, float y, float w, float h); @@ -141,11 +141,6 @@ void ui_infof(ui_window *uiw, const char *fmt, ...) uiw->simview.info_time = get_time(); } -static void ui_simview_set_select(ui_simview *sv, vec2_t sel_2d) -{ - -} - void ui_event_window(SDL_Event *event, ui_window *uiw) { ui_simview *sv = &uiw->simview; @@ -300,8 +295,9 @@ void ui_draw_simview_xsection(ui_window *uiw, float *field) vec2_t origin_s, scale_s; SDL_mutexP(sim->rotate_lock); - r_xsection_update(uiw->rw, &sv->xsection, &sim->field_info, - field, sv->xsection_type, sv->xsection_frac); + r_xsection_update(uiw->rw, &sv->xsection, &sim->field_info, field, + sim->frame_index, sv->xsection_type, + sv->xsection_frac); SDL_mutexV(sim->rotate_lock); aspect_ratio = sv->xsection.aspect_ratio; @@ -326,7 +322,6 @@ void ui_draw_simview_xsection(ui_window *uiw, float *field) void ui_draw_simview_selection(ui_window *uiw) { ui_simview *sv = &uiw->simview; - phy_sim *sim = sv->sim; vec2_t select_s; if (sv->selecting) |