diff options
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | TODO | 5 | ||||
| -rw-r--r-- | src/common.c | 21 | ||||
| -rw-r--r-- | src/common.h | 141 | ||||
| -rw-r--r-- | src/itc.c | 3 | ||||
| -rw-r--r-- | src/itc.h | 26 | ||||
| -rw-r--r-- | src/main.c | 23 | ||||
| -rw-r--r-- | src/physics.c | 2 | ||||
| -rw-r--r-- | src/physics.h | 46 | ||||
| -rw-r--r-- | src/renderer.c | 2 | ||||
| -rw-r--r-- | src/renderer.h | 62 | ||||
| -rw-r--r-- | src/ui.c | 2 | ||||
| -rw-r--r-- | src/ui.h | 16 | 
13 files changed, 189 insertions, 163 deletions
@@ -9,7 +9,8 @@ PP_CC := $(PP_BOLD)$(shell tput setf 6)CC$(PP_RESET)  PP_LD := $(PP_BOLD)$(shell tput setf 2)LD$(PP_RESET)  PP_RM := $(PP_BOLD)$(shell tput setf 4)RM$(PP_RESET) -SRC := src/main.c src/physics.c src/renderer.c src/ui.c src/itc.c +SRC := src/main.c src/physics.c src/renderer.c src/ui.c src/itc.c \ +       src/common.c  OBJ := $(SRC:src/%.c=obj/%.o)  OUT := cem @@ -1,4 +1 @@ -refactor - -new shit: -	phy_control and shit +itc_chan_destroy: free queue diff --git a/src/common.c b/src/common.c new file mode 100644 index 0000000..71484e5 --- /dev/null +++ b/src/common.c @@ -0,0 +1,21 @@ +#include "common.h" +#include <time.h> + +char *va(const char *fmt, ...) +{ +	va_list vl; +	static char buffer[4096]; + +	va_start(vl, fmt); +	vsnprintf(buffer, sizeof(buffer), fmt, vl); +	va_end(vl); + +	return buffer; +} + +int64_t get_time(void) +{ +	struct timespec ts; +	clock_gettime(CLOCK_MONOTONIC, &ts); +	return ts.tv_sec * 1000000000 + ts.tv_nsec; +} diff --git a/src/common.h b/src/common.h index 1b8e719..8933749 100644 --- a/src/common.h +++ b/src/common.h @@ -1,3 +1,7 @@ +#ifndef _COMMON_H +#define _COMMON_H + +#include <stdio.h>  #include <stdlib.h>  #include <inttypes.h>  #include <string.h>   @@ -8,21 +12,16 @@  #define PROGRAM_NAME "Symulator pól elektromagnetycznych" -#include <stdio.h> -#define con_printf printf +#define con_printf printf // TODO?  #define max2(a, b) ((a) > (b) ? (a) : (b))  #define max3(a, b, c) (max2(max2(a, b), c))  #define min2(a, b) ((a) < (b) ? (a) : (b))  #define min3(a, b, c) (min2(min2(a, b), c)) -// main -  char *va(const char *fmt, ...);  int64_t get_time(void); -// math -  typedef float vec_t;  typedef vec_t vec2_t[2];     typedef vec_t vec3_t[3];     @@ -149,132 +148,4 @@ static inline void mst2_dump(mst2_t M)  	printf("[%f\t%f\t%f]\n", 0.0, 0.0, 1.0);  } -// itc - -typedef struct itc_message_s itc_message; -struct itc_message_s { -	int number; -	void *data; - -	itc_message *older, *newer; -}; - -typedef struct { -	itc_message *newest, *oldest; -	SDL_mutex *mutex; -	SDL_sem *sem; -} itc_chan; - -void itc_chan_create(itc_chan *chan); -void itc_chan_destroy(itc_chan *chan); -void itc_chan_push(itc_chan *chan, int number, void *data); -int itc_chan_pop(itc_chan *chan, int *number, void **data); -int itc_chan_pop_block(itc_chan *chan, int *number, void **data); - -// physics - -typedef struct { -	size_t width, height, depth; -	size_t zstr, ystr, xstr, size; // strides in no. of points (not bytes) -	size_t zstr1, ystr1, xstr1, size1; // same as above but for associated -	                                   // scalar fields -	float spacing; // in meters -} phy_field_info; - -typedef struct { -	float *E; -	float *H; -} phy_field_em; - -enum { -	PHY_CMD_QUIT, -	PHY_CMD_PAUSE, -	PHY_CMD_RESUME, -	PHY_CMD_STEP -}; - -typedef struct { -	phy_field_info field_info; -	phy_field_em fields[3]; -	float *field_eps, *field_mu; //permittivity and permeability -	float time; - -	// UI stuff -	bool running; -	itc_chan ctl; -	SDL_mutex *rotate_lock; -} phy_sim; - -void phy_sim_destroy(phy_sim *sim); -int phy_sim_create(phy_sim *sim); -void phy_sim_compute_const_fields(phy_sim *sim); -void phy_sim_step(phy_sim *sim, float dt); - -int phy_thread(phy_sim *sim); - -// renderer - -extern float r_color_white[4]; -extern float r_color_black[4]; -extern float r_color_red[4]; -extern float r_color_blue[4]; - -typedef struct r_window_s r_window; -struct r_window_s { -	SDL_Window *window; -	SDL_Renderer *renderer; -	SDL_Texture *font_texture; - -	r_window *prev, *next; -}; - -int r_init(void); -void r_quit(void); - -r_window *r_window_create(void); -void r_window_destroy(r_window *rw); - -void r_clear(r_window *rw, float *color); -void r_flip(r_window *rw); - -void r_clip_enable(r_window *rw, float x, float y, float w, float h); -void r_clip_disable(r_window *rw); -void r_draw_line(r_window *rw, float x0, float y0, float x1, float y1, -                 float *color); -void r_draw_rect(r_window *rw, float x, float y, float w, float h, -                 float *color); - -#define TEXT_CENTERX     0x0001 -#define TEXT_RIGHTX      0x0002 -float r_text_width(float h, char *text); -void r_draw_text(r_window *rw, float x, float y, float h, char *text, -                 float *color, int flags); - -typedef enum { -	XSECTION_XY, -	XSECTION_XZ, -	XSECTION_YZ -} r_xsection_type; - -typedef struct { -	SDL_Texture *texture; -	float aspect_ratio; -} 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, -                      r_xsection_type type, float frac); -void r_xsection_draw(r_window *rw, r_xsection *xsection, -                     float x, float y, float w, float h); - -// ui - -int ui_init(void); -void ui_quit(void); - -void ui_renderer_window_register(r_window *rw); - -void ui_event(SDL_Event *event); -void ui_draw(phy_sim *sim); +#endif // _COMMON_H @@ -1,5 +1,4 @@ -#include "common.h" -#include <unistd.h> +#include "itc.h"  void itc_chan_create(itc_chan *chan)  { diff --git a/src/itc.h b/src/itc.h new file mode 100644 index 0000000..485b1bb --- /dev/null +++ b/src/itc.h @@ -0,0 +1,26 @@ +#ifndef _ITC_H +#define _ITC_H + +#include "common.h" + +typedef struct itc_message_s itc_message; +struct itc_message_s { +	int number; +	void *data; + +	itc_message *older, *newer; +}; + +typedef struct { +	itc_message *newest, *oldest; +	SDL_mutex *mutex; +	SDL_sem *sem; +} itc_chan; + +void itc_chan_create(itc_chan *chan); +void itc_chan_destroy(itc_chan *chan); +void itc_chan_push(itc_chan *chan, int number, void *data); +int itc_chan_pop(itc_chan *chan, int *number, void **data); +int itc_chan_pop_block(itc_chan *chan, int *number, void **data); + +#endif // _ITC_H @@ -1,25 +1,10 @@ -#include "common.h"  #include <signal.h>  #include <time.h> -char *va(const char *fmt, ...) -{ -	va_list vl; -	static char buffer[4096]; - -	va_start(vl, fmt); -	vsnprintf(buffer, sizeof(buffer), fmt, vl); -	va_end(vl); - -	return buffer; -} - -int64_t get_time(void) -{ -	struct timespec ts; -	clock_gettime(CLOCK_MONOTONIC, &ts); -	return ts.tv_sec * 1000000000 + ts.tv_nsec; -} +#include "common.h"   +#include "physics.h" +#include "renderer.h" +#include "ui.h"  void itc_test(void); diff --git a/src/physics.c b/src/physics.c index c8a7cbd..5b904c6 100644 --- a/src/physics.c +++ b/src/physics.c @@ -1,4 +1,6 @@  #include "common.h" +#include "itc.h" +#include "physics.h"  void phy_sim_destroy(phy_sim *sim) {  	size_t i; diff --git a/src/physics.h b/src/physics.h new file mode 100644 index 0000000..533d8a4 --- /dev/null +++ b/src/physics.h @@ -0,0 +1,46 @@ +#ifndef _PHYSICS_H +#define _PHYSICS_H + +#include "common.h" +#include "itc.h" + +typedef struct { +	size_t width, height, depth; +	size_t zstr, ystr, xstr, size; // strides in no. of points (not bytes) +	size_t zstr1, ystr1, xstr1, size1; // same as above but for associated +	                                   // scalar fields +	float spacing; // in meters +} phy_field_info; + +typedef struct { +	float *E; +	float *H; +} phy_field_em; + +enum { +	PHY_CMD_QUIT, +	PHY_CMD_PAUSE, +	PHY_CMD_RESUME, +	PHY_CMD_STEP +}; + +typedef struct { +	phy_field_info field_info; +	phy_field_em fields[3]; +	float *field_eps, *field_mu; //permittivity and permeability +	float time; + +	// UI stuff +	bool running; +	itc_chan ctl; +	SDL_mutex *rotate_lock; +} phy_sim; + +void phy_sim_destroy(phy_sim *sim); +int phy_sim_create(phy_sim *sim); +void phy_sim_compute_const_fields(phy_sim *sim); +void phy_sim_step(phy_sim *sim, float dt); + +int phy_thread(phy_sim *sim); + +#endif // _PHYSICS_H diff --git a/src/renderer.c b/src/renderer.c index 11c3706..3c403a0 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -1,5 +1,5 @@ -#define _RENDERER_C  #include "common.h" +#include "renderer.h"  #include <SDL2/SDL_image.h>  #define FONT_FILE "assets/font.png" diff --git a/src/renderer.h b/src/renderer.h new file mode 100644 index 0000000..0c38e6d --- /dev/null +++ b/src/renderer.h @@ -0,0 +1,62 @@ +#ifndef _RENDERER_H +#define _RENDERER_H + +#include "common.h" +#include "physics.h" + +extern float r_color_white[4]; +extern float r_color_black[4]; +extern float r_color_red[4]; +extern float r_color_blue[4]; + +typedef struct r_window_s r_window; +struct r_window_s { +	SDL_Window *window; +	SDL_Renderer *renderer; +	SDL_Texture *font_texture; + +	r_window *prev, *next; +}; + +int r_init(void); +void r_quit(void); + +r_window *r_window_create(void); +void r_window_destroy(r_window *rw); + +void r_clear(r_window *rw, float *color); +void r_flip(r_window *rw); + +void r_clip_enable(r_window *rw, float x, float y, float w, float h); +void r_clip_disable(r_window *rw); +void r_draw_line(r_window *rw, float x0, float y0, float x1, float y1, +                 float *color); +void r_draw_rect(r_window *rw, float x, float y, float w, float h, +                 float *color); + +#define TEXT_CENTERX     0x0001 +#define TEXT_RIGHTX      0x0002 +float r_text_width(float h, char *text); +void r_draw_text(r_window *rw, float x, float y, float h, char *text, +                 float *color, int flags); + +typedef enum { +	XSECTION_XY, +	XSECTION_XZ, +	XSECTION_YZ +} r_xsection_type; + +typedef struct { +	SDL_Texture *texture; +	float aspect_ratio; +} 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, +                      r_xsection_type type, float frac); +void r_xsection_draw(r_window *rw, r_xsection *xsection, +                     float x, float y, float w, float h); + +#endif // _RENDERER_H @@ -1,4 +1,4 @@ -#include "common.h" +#include "ui.h"  struct {  	float font_size; diff --git a/src/ui.h b/src/ui.h new file mode 100644 index 0000000..73b355b --- /dev/null +++ b/src/ui.h @@ -0,0 +1,16 @@ +#ifndef _UI_H +#define _UI_H + +#include "common.h" +#include "renderer.h" +#include "physics.h" + +int ui_init(void); +void ui_quit(void); + +void ui_renderer_window_register(r_window *rw); + +void ui_event(SDL_Event *event); +void ui_draw(phy_sim *sim); + +#endif // _UI_H  | 
