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