]> icculus.org git repositories - divverent/nexuiz.git/blob - data/menuqc/util/rect.qc
you now die of becoming too fast (please revert once the "entities falling through...
[divverent/nexuiz.git] / data / menuqc / util / rect.qc
1 // NG Menu
2 // util/rect.qc
3
4 /*
5 ===================
6 Util_InRect
7 ===================
8 */
9 bool( vector pPoint, vector pPos, vector pSize ) Util_InRect =
10 {
11         if( pPoint_x < pPos_x || pPoint_y < pPos_y || pPoint_x > pPos_x + pSize_x || pPoint_y > pPos_y + pSize_y )
12                 return false;
13         return true;
14 };
15
16 bool( vector pPos1, vector pSize1, vector pPos2, vector pSize2 ) Util_RectInRect =
17 {
18         local vector lFPos1, lFPos2;
19
20         lFPos1 = pPos1 + pSize1;
21         lFPos2 = pPos2 + pSize2;
22
23         if( pPos1_x <= lFPos2_x && pPos2_x <= lFPos1_x && pPos1_y <= lFPos2_y && pPos2_y <= lFPos1_y )
24                 return false;
25         return true;
26 };
27
28 /*
29 ===================
30 Util_ClipPoint
31 ===================
32 */
33 /*
34 vector( vector pPoint, vector pPos, vector pSize ) Util_ClipPoint =
35 {
36         local vector lPoint;
37         lPoint_x = bound( pPos_x, pPoint_x, pPos_x + pSize_x );
38         lPoint_y = bound( pPos_y, pPoint_y, pPos_y + pSize_y );
39         lPoint_z = 0;
40
41         return lPoint;
42 };
43 */
44
45 vector( vector pPoint, vector pClipPos, vector pClipSize ) Util_GetClipDelta =
46 {
47         local vector lPoint;
48         lPoint_x = bound( pClipPos_x, pPoint_x, pClipPos_x + pClipSize_x ) - pPoint_x;
49         lPoint_y = bound( pClipPos_y, pPoint_y, pClipPos_y + pClipSize_y ) - pPoint_y;
50         lPoint_z = 0;
51
52         return lPoint;
53 };
54
55 /*
56 ===================
57 Util_ClipRect
58 ===================
59 */
60 vector( vector pPos, vector pSize, vector pClipPos, vector pClipSize ) Util_ClipRect =
61 {
62         vector lSize;
63
64         //DEBUG: Safe version
65         //lSize_x = bound( pClipPos_x, pPos_x + pSize_x, pClipPos_x + pClipSize_x ) - bound( pClipPos_x, pPos_x, pClipPos_x + pClipSize_x );
66         //lSize_y = bound( pClipPos_y, pPos_y + pSize_y, pClipPos_y + pClipSize_y ) - bound( pClipPos_y, pPos_y, pClipPos_y + pClipSize_y );
67         //lSize_x = min( pPos_x + pSize_x, pClipPos_x + pClipSize_x ) - max( pPos_x, pClipPos_x );
68         //lSize_y = min( pPos_y + pSize_y, pClipPos_y + pClipSize_y ) - max( pPos_y, pClipPos_y );
69         //INFO: we suppose pPos to be already clipped and pSize to have been adjusted(!!)
70         lSize_x = min( pPos_x + pSize_x, pClipPos_x + pClipSize_x ) - pPos_x;
71         lSize_y = min( pPos_y + pSize_y, pClipPos_y + pClipSize_y ) - pPos_y;
72         lSize_z = 0;
73
74         if( lSize_x <= 0 || lSize_y <= 0 )
75                 return '0 0 0';
76
77         return lSize;
78 };
79
80 /*
81 ===================
82 Util_ClipStack_Reset
83 ===================
84 */
85 string( string pStack ) Util_ClipStack_Reset =
86 {
87         String_Free( pStack );
88         return String_Create();
89 };
90
91 /*
92 ===================
93 Util_ClipStack_Push
94 ===================
95 */
96 string( string pStack, vector pPos, vector pSize ) Util_ClipStack_Push =
97 {
98         local vector lOldPos, lOldSize, lDelta;
99
100         lOldPos = Util_ClipStack_GetPosition( pStack );
101         lOldSize = Util_ClipStack_GetSize( pStack );
102
103         if( pPos == '0 0 0' && pSize == '0 0 0' ) {
104                 pPos  = lOldPos;
105                 pSize = lOldSize;
106         } else if( lOldPos != '0 0 0' || lOldSize != '0 0 0'  ) {
107                 lDelta = Util_GetClipDelta( pPos, lOldPos, lOldSize );
108                 pPos = pPos + lDelta;
109                 pSize = Util_ClipRect( pPos, pSize - lDelta, lOldPos, lOldSize );
110         }
111
112         pStack = Util_AltStringPush( pStack, vtos( pSize ) );
113         pStack = Util_AltStringPush( pStack, vtos( pPos ) );
114
115         return pStack;
116 };
117
118 /*
119 ===================
120 Util_ClipStack_Pop
121 ===================
122 */
123 string( string pStack ) Util_ClipStack_Pop =
124 {
125         pStack = Util_AltStringPop( pStack );
126         pStack = Util_AltStringPop( pStack );
127         return pStack;
128 };
129
130 /*
131 ===================
132 Util_ClipStack_GetPosition
133 ===================
134 */
135 vector( string pStack ) Util_ClipStack_GetPosition =
136 {
137         return stov( String_Normal( Util_GetAltStringItem( pStack, 0 ) ) );
138 };
139
140 /*
141 ===================
142 Util_ClipStack_GetSize
143 ===================
144 */
145 vector( string pStack ) Util_ClipStack_GetSize =
146 {
147         return stov( String_Normal( Util_GetAltStringItem( pStack, 1 ) ) );
148 };
149
150 /*
151 ===================
152 Util_OriginStack_Reset
153 ===================
154 */
155 string( string pStack ) Util_OriginStack_Reset =
156 {
157         String_Free( pStack );
158         return String_Create();
159 };
160
161 /*
162 ===================
163 Util_OriginStack_Push
164 ===================
165 */
166 string( string pStack, vector pOrigin ) Util_OriginStack_Push =
167 {
168         return Util_AltStringPush( pStack, vtos( pOrigin ) );
169 };
170
171 /*
172 ===================
173 Util_OriginStack_Pop
174 ===================
175 */
176 string( string pStack ) Util_OriginStack_Pop =
177 {
178         return Util_AltStringPop( pStack );
179 };
180
181 /*
182 ===================
183 Util_OriginStack_Get
184 ===================
185 */
186 vector( string pStack ) Util_OriginStack_Get =
187 {
188         return stov( String_Normal( Util_GetAltStringTop( pStack ) ) );
189 };