1 /* 2 * slit.h 3 * slit in Mondrian 4 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath 5 * For more information, please visit http://dinisnoise.org/ 6 */ 7 8 #ifndef __slit__ 9 #define __slit__ 10 11 #include <list> 12 #include "fader.h" 13 14 struct rect; 15 16 struct slit { // a slit on an edge of a box 17 18 rect* boxes [2]; // slit can be on 2 boxes 19 int edges [2]; // edges of the boxes that has the slit 20 21 int type; 22 enum {INVALID=-1, VERTICAL, HORIZONTAL}; 23 24 float start, mid, end; 25 static float HALF_SIZE; 26 static float MIN_HALF_SIZE; 27 static float MIN_SIZE; // 2 * MIN_HALF_SIZE 28 29 static int ref; // log 30 31 double animt; // animation duration 32 fader* fdr; // to animate slit 33 static const double INITIAL_OPEN_CLOSE_TIME; 34 35 slit (); 36 slit (rect** bxs, float x, float y, float sz, fader* fdr = 0); 37 ~slit (); 38 int is_too_small (); calc_midslit39 inline void calc_mid () { mid = (start+end) / 2.0; } 40 41 float anim_start, anim_end; // start,end at start of animation 42 void toggle_anim (); 43 void eval_anim (); 44 45 int select; // selected? 46 47 }; 48 49 struct slit_info { 50 float x, y, half_size; 51 int anim; 52 fader fdr; 53 slit_info (); 54 }; 55 56 struct slit_lip_t { // for editing slit 57 slit* slitt; 58 float* lip; 59 float* prev; 60 float* cur; 61 float low, high; slit_lip_tslit_lip_t62 slit_lip_t () { clear ();} 63 void edit (); 64 void clear (); 65 void set_high (float h); 66 void set_low (float l); 67 }; 68 69 struct slit_drawer { // for drawing 70 static const int MAX_LINES = 512; 71 float* verts; 72 int cur; 73 int last; 74 slit_drawer (int n = MAX_LINES); 75 ~slit_drawer (); 76 void add (float x, float y); 77 void draw (); 78 }; 79 80 void draw_slits (float start, float end, float level, int type, std::list<slit*>& _slits, slit_drawer& slit_drawerr); 81 rect* get_other_rect_of_slit (rect* ir, int e, float v, slit** os); 82 slit* slit_hit (rect* b, int e, float v); 83 slit* slit_hit (rect** bxs, float x, float y); 84 int get_slit_lip (slit_lip_t& sl, rect* R, int e, float v); 85 86 typedef std::list<slit*>::iterator slit_iterator; 87 88 #endif 89