├── CMakeLists.txt
├── LICENSE.txt
├── README.md
├── connectome
├── CElegansConnectome.csv
└── NodesIds.csv
└── src
├── Celegans.c
├── Celegans.h
├── VSGraphics.h
├── VSSystem.h
├── brain.c
├── brain.h
├── main.c
└── stb_image.h
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.10)
2 |
3 | project(micro VERSION 1.0)
4 |
5 | set(CMAKE_C_STANDARD 11)
6 | set(CMAKE_C_STANDARD_REQUIRED True)
7 | set(CMAKE_BUILD_TYPE Debug)
8 |
9 | # Set output directories
10 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
11 |
12 | if(APPLE)
13 | include_directories(/opt/homebrew/include)
14 | link_directories(/opt/homebrew/lib)
15 | elseif(UNIX)
16 | include_directories(/usr/local/include)
17 | link_directories(/usr/local/lib)
18 | endif()
19 |
20 | # Source files
21 | file(GLOB_RECURSE SOURCES "./src/*.c")
22 |
23 | # Executable
24 | add_executable(main ${SOURCES})
25 |
26 | # Link libraries
27 | find_package(OpenGL REQUIRED)
28 |
29 | target_link_libraries(main
30 | ${OPENGL_LIBRARIES}
31 | m # math library
32 | )
33 |
34 | target_link_libraries(main
35 | SDL2
36 | )
37 |
38 | # Compiler flags
39 | target_compile_options(main PRIVATE -Wall -O3)
40 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Carlo Meroni
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | C. elegans simulation
2 | ======
3 |
4 | This program simulate the C. elegans brain and body in a virtual environment.
5 | [Click here to see the video of the simulation](https://youtu.be/WAYeeMcu1tY "C.elegans brain and body simulation")
6 |
7 | Instructions
8 | ======
9 | I tested the program only on Linux , so here's the instructions to build the program on Linux.
10 | This does not mean that you can't compile the program on other platforms.
11 |
12 | You need to install SDL2 and OpenGL libraries.
13 | On ubuntu just run this:
14 | ```bash
15 | sudo apt-get install libsdl2-dev
16 | ```
17 | On OSX run:
18 | ```bash
19 | brew install sdl2
20 | ```
21 | Then clone the repository to your computer, go to main directory and run:
22 | ```bash
23 | sudo cmake .
24 | make
25 | ./bin/main
26 | ```
27 | To 'turn on' the worm, hold the F key for few seconds.
28 |
29 | You can control the simulation with the keyboard:
30 | S = show brain and muscle data
31 | F = give food to the worm
32 | N = touch the worm nose
33 | A = touch anterior
34 | P = touch posterior
35 | Q = quit
36 |
37 |
38 | License
39 | ======
40 | The MIT License (MIT)
41 |
42 | Copyright (c) 2015 Carlo Meroni
43 |
44 | Permission is hereby granted, free of charge, to any person obtaining a copy
45 | of this software and associated documentation files (the "Software"), to deal
46 | in the Software without restriction, including without limitation the rights
47 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
48 | copies of the Software, and to permit persons to whom the Software is
49 | furnished to do so, subject to the following conditions:
50 |
51 | The above copyright notice and this permission notice shall be included in
52 | all copies or substantial portions of the Software.
53 |
54 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
55 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
56 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
57 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
58 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
59 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
60 | THE SOFTWARE.
61 |
--------------------------------------------------------------------------------
/connectome/CElegansConnectome.csv:
--------------------------------------------------------------------------------
1 | node1,node2,weight
2 | ADAL,ADAR,1
3 | ADAL,ADFL,1
4 | ADAL,AIBL,1
5 | ADAL,AIBR,2
6 | ADAL,ASHL,1
7 | ADAL,AVAR,2
8 | ADAL,AVBL,4
9 | ADAL,AVBR,7
10 | ADAL,AVDL,1
11 | ADAL,AVDR,2
12 | ADAL,AVEL,1
13 | ADAL,AVJR,5
14 | ADAL,FLPR,1
15 | ADAL,PVQL,1
16 | ADAL,RICL,1
17 | ADAL,RICR,1
18 | ADAL,RIML,3
19 | ADAL,RIPL,1
20 | ADAL,SMDVR,2
21 | ADAR,ADAL,1
22 | ADAR,ADFR,1
23 | ADAR,AIBL,1
24 | ADAR,AIBR,1
25 | ADAR,ASHR,1
26 | ADAR,AVAL,1
27 | ADAR,AVBL,1
28 | ADAR,AVBR,5
29 | ADAR,AVDL,2
30 | ADAR,AVEL,1
31 | ADAR,AVJL,3
32 | ADAR,PVQR,1
33 | ADAR,RICL,1
34 | ADAR,RIMR,5
35 | ADAR,RIPR,1
36 | ADAR,RIVR,1
37 | ADAR,SMDVL,2
38 | ADEL,ADAL,1
39 | ADEL,ADER,1
40 | ADEL,AINL,1
41 | ADEL,AVAL,2
42 | ADEL,AVAR,3
43 | ADEL,AVEL,1
44 | ADEL,AVKR,1
45 | ADEL,AVL,1
46 | ADEL,BDUL,1
47 | ADEL,CEPDL,1
48 | ADEL,FLPL,1
49 | ADEL,IL1L,1
50 | ADEL,IL2L,1
51 | ADEL,MDL05,1
52 | ADEL,OLLL,1
53 | ADEL,RIAL,1
54 | ADEL,RIFL,1
55 | ADEL,RIGL,5
56 | ADEL,RIGR,3
57 | ADEL,RIH,2
58 | ADEL,RIVL,1
59 | ADEL,RIVR,1
60 | ADEL,RMDL,2
61 | ADEL,RMGL,1
62 | ADEL,RMHL,1
63 | ADEL,SIADR,1
64 | ADEL,SIBDR,1
65 | ADEL,SMBDR,1
66 | ADEL,URBL,1
67 | ADER,ADAR,1
68 | ADER,ADEL,2
69 | ADER,ALA,1
70 | ADER,AVAL,5
71 | ADER,AVAR,1
72 | ADER,AVDR,2
73 | ADER,AVER,1
74 | ADER,AVJR,1
75 | ADER,AVKL,1
76 | ADER,AVKL,1
77 | ADER,AVKR,1
78 | ADER,CEPDR,1
79 | ADER,FLPL,1
80 | ADER,FLPR,1
81 | ADER,OLLR,2
82 | ADER,PVR,1
83 | ADER,RIGL,7
84 | ADER,RIGR,4
85 | ADER,RIH,1
86 | ADER,RMDR,2
87 | ADER,SAAVR,1
88 | ADFL,ADAL,1
89 | ADFL,ADAL,1
90 | ADFL,AIZL,12
91 | ADFL,AUAL,5
92 | ADFL,OLQVL,1
93 | ADFL,RIAL,15
94 | ADFL,RIGL,1
95 | ADFL,RIR,2
96 | ADFL,SMBVL,2
97 | ADFR,ADAR,1
98 | ADFR,ADAR,1
99 | ADFR,AIAR,1
100 | ADFR,AIYR,1
101 | ADFR,AIZR,8
102 | ADFR,ASHR,1
103 | ADFR,AUAR,4
104 | ADFR,AWBR,1
105 | ADFR,PVPR,1
106 | ADFR,RIAR,16
107 | ADFR,RIGR,3
108 | ADFR,RIR,3
109 | ADFR,SMBDR,1
110 | ADFR,SMBVR,2
111 | ADFR,URXR,1
112 | ADLL,ADLR,1
113 | ADLL,AIAL,6
114 | ADLL,AIBL,7
115 | ADLL,AIBR,1
116 | ADLL,ALA,2
117 | ADLL,ASER,3
118 | ADLL,ASHL,2
119 | ADLL,AVAL,2
120 | ADLL,AVAR,3
121 | ADLL,AVBL,2
122 | ADLL,AVDL,1
123 | ADLL,AVDR,4
124 | ADLL,AVDR,1
125 | ADLL,AVJL,1
126 | ADLL,AVJR,3
127 | ADLL,AWBL,2
128 | ADLL,OLQVL,1
129 | ADLL,OLQVL,1
130 | ADLL,RIPL,1
131 | ADLL,RMGL,1
132 | ADLR,ADLL,1
133 | ADLR,AIAR,10
134 | ADLR,AIBR,10
135 | ADLR,ASER,1
136 | ADLR,ASHR,3
137 | ADLR,AVAR,2
138 | ADLR,AVBL,1
139 | ADLR,AVBR,2
140 | ADLR,AVDL,5
141 | ADLR,AVDR,2
142 | ADLR,AVJR,1
143 | ADLR,AWCR,3
144 | ADLR,OLLR,1
145 | ADLR,PVCL,1
146 | ADLR,RICL,1
147 | ADLR,RICR,1
148 | AFDL,AFDR,1
149 | AFDL,AIBL,1
150 | AFDL,AINR,1
151 | AFDL,AIYL,7
152 | AFDR,AFDL,1
153 | AFDR,AIBR,1
154 | AFDR,AIYR,13
155 | AFDR,ASER,1
156 | AIAL,ADAL,1
157 | AIAL,AIAR,1
158 | AIAL,AIBL,10
159 | AIAL,AIML,2
160 | AIAL,AIZL,1
161 | AIAL,ASER,3
162 | AIAL,ASGL,1
163 | AIAL,ASHL,1
164 | AIAL,ASIL,2
165 | AIAL,ASKL,3
166 | AIAL,AWAL,1
167 | AIAL,AWCR,1
168 | AIAL,HSNL,1
169 | AIAL,RIFL,1
170 | AIAL,RMGL,1
171 | AIAR,ADAR,1
172 | AIAR,ADFR,1
173 | AIAR,ADLR,2
174 | AIAR,AIAL,1
175 | AIAR,AIBR,14
176 | AIAR,AIZR,1
177 | AIAR,ASER,1
178 | AIAR,ASGR,1
179 | AIAR,ASIR,2
180 | AIAR,AWAR,1
181 | AIAR,AWAR,1
182 | AIAR,AWCL,1
183 | AIAR,AWCR,3
184 | AIAR,RIFR,2
185 | AIBL,AFDL,1
186 | AIBL,AIYL,1
187 | AIBL,ASER,1
188 | AIBL,AVAL,2
189 | AIBL,AVBL,5
190 | AIBL,DVC,1
191 | AIBL,FLPL,1
192 | AIBL,PVT,1
193 | AIBL,RIBR,4
194 | AIBL,RIFL,1
195 | AIBL,RIGR,1
196 | AIBL,RIGR,3
197 | AIBL,RIML,2
198 | AIBL,RIMR,13
199 | AIBL,RIMR,1
200 | AIBL,RIVL,1
201 | AIBL,SAADL,2
202 | AIBL,SAADR,2
203 | AIBL,SMDDR,4
204 | AIBR,AFDR,1
205 | AIBR,AVAR,1
206 | AIBR,AVBR,3
207 | AIBR,AVEL,1
208 | AIBR,DB1,1
209 | AIBR,DVC,2
210 | AIBR,PVT,1
211 | AIBR,RIAL,1
212 | AIBR,RIBL,4
213 | AIBR,RIGL,3
214 | AIBR,RIML,16
215 | AIBR,RIML,1
216 | AIBR,RIMR,1
217 | AIBR,RIS,1
218 | AIBR,RIVR,1
219 | AIBR,SAADL,1
220 | AIBR,SMDDL,3
221 | AIBR,SMDVL,1
222 | AIBR,VB1,3
223 | AIML,AIAL,5
224 | AIML,ALML,1
225 | AIML,ASGL,2
226 | AIML,ASKL,2
227 | AIML,AVBR,2
228 | AIML,AVDL,1
229 | AIML,AVDR,1
230 | AIML,AVER,1
231 | AIML,AVFL,4
232 | AIML,AVFR,1
233 | AIML,AVHL,2
234 | AIML,AVHR,1
235 | AIML,AVJL,1
236 | AIML,PVQL,1
237 | AIML,RIFL,1
238 | AIML,SIBDR,1
239 | AIML,SMBVL,1
240 | AIMR,AIAR,5
241 | AIMR,ASGR,2
242 | AIMR,ASJR,2
243 | AIMR,ASKR,3
244 | AIMR,AVDR,1
245 | AIMR,AVFL,1
246 | AIMR,AVFR,1
247 | AIMR,HSNL,1
248 | AIMR,HSNR,2
249 | AIMR,OLQDR,1
250 | AIMR,PVNR,1
251 | AIMR,RIFR,1
252 | AIMR,RMGR,1
253 | AINL,ADEL,1
254 | AINL,AFDR,5
255 | AINL,AINR,2
256 | AINL,ASEL,3
257 | AINL,ASGR,1
258 | AINL,ASGR,1
259 | AINL,AUAR,1
260 | AINL,AUAR,1
261 | AINL,BAGL,3
262 | AINL,RIBL,1
263 | AINL,RIBR,2
264 | AINR,AFDL,4
265 | AINR,AFDR,1
266 | AINR,AIAL,2
267 | AINR,AIBL,2
268 | AINR,AINL,2
269 | AINR,ASEL,1
270 | AINR,ASER,1
271 | AINR,ASGL,1
272 | AINR,AUAL,1
273 | AINR,AUAR,1
274 | AINR,BAGR,3
275 | AINR,RIBL,2
276 | AINR,RID,1
277 | AIYL,AIYR,1
278 | AIYL,AIZL,13
279 | AIYL,AWAL,3
280 | AIYL,AWCL,1
281 | AIYL,AWCR,1
282 | AIYL,HSNR,1
283 | AIYL,RIAL,7
284 | AIYL,RIBL,4
285 | AIYL,RIML,1
286 | AIYR,ADFR,1
287 | AIYR,AIYL,1
288 | AIYR,AIZR,8
289 | AIYR,AWAR,1
290 | AIYR,HSNL,1
291 | AIYR,RIAR,6
292 | AIYR,RIBR,2
293 | AIYR,RIMR,1
294 | AIZL,AIAL,3
295 | AIZL,AIBL,2
296 | AIZL,AIBR,8
297 | AIZL,AIZR,2
298 | AIZL,ASEL,1
299 | AIZL,ASGL,1
300 | AIZL,ASHL,1
301 | AIZL,AVER,5
302 | AIZL,DVA,1
303 | AIZL,RIAL,8
304 | AIZL,RIGL,1
305 | AIZL,RIML,4
306 | AIZL,SMBDL,9
307 | AIZL,SMBVL,7
308 | AIZL,VB2,1
309 | AIZR,AIAR,1
310 | AIZR,AIBL,8
311 | AIZR,AIBR,1
312 | AIZR,AIZL,2
313 | AIZR,ASGR,1
314 | AIZR,ASHR,1
315 | AIZR,AVEL,4
316 | AIZR,AVER,1
317 | AIZR,AWAR,1
318 | AIZR,DVA,1
319 | AIZR,RIAR,7
320 | AIZR,RIMR,4
321 | AIZR,SMBDR,5
322 | AIZR,SMBVR,3
323 | AIZR,SMDDR,1
324 | ALA,ADEL,1
325 | ALA,AVAL,1
326 | ALA,AVEL,2
327 | ALA,AVER,1
328 | ALA,RID,1
329 | ALA,RMDR,1
330 | ALML,AVDR,1
331 | ALML,AVEL,1
332 | ALML,AVM,1
333 | ALML,BDUL,6
334 | ALML,CEPDL,3
335 | ALML,CEPVL,2
336 | ALML,PVCL,2
337 | ALML,PVCR,1
338 | ALML,PVR,1
339 | ALML,RMDDR,1
340 | ALML,RMGL,1
341 | ALML,SDQL,1
342 | ALMR,AVM,1
343 | ALMR,BDUR,5
344 | ALMR,CEPDR,1
345 | ALMR,CEPVR,1
346 | ALMR,PVCR,3
347 | ALMR,RMDDL,1
348 | ALMR,SIADL,1
349 | ALNL,SAAVL,3
350 | ALNL,SMBDR,2
351 | ALNL,SMBDR,1
352 | ALNL,SMDVL,1
353 | ALNR,ADER,1
354 | ALNR,RMHR,1
355 | ALNR,SAAVR,2
356 | ALNR,SMBDL,2
357 | ALNR,SMDDR,1
358 | ALNR,SMDVL,1
359 | AQR,AVAL,1
360 | AQR,AVAR,3
361 | AQR,AVBL,3
362 | AQR,AVBL,1
363 | AQR,AVBR,4
364 | AQR,AVDL,1
365 | AQR,AVDR,1
366 | AQR,AVJL,1
367 | AQR,AVKL,2
368 | AQR,AVKR,1
369 | AQR,BAGL,2
370 | AQR,BAGR,2
371 | AQR,PVCR,2
372 | AQR,PVPL,1
373 | AQR,PVPL,7
374 | AQR,PVPR,9
375 | AQR,RIAL,3
376 | AQR,RIAR,1
377 | AQR,RIGL,2
378 | AQR,RIGR,1
379 | AQR,URXL,1
380 | AS1,AVAL,3
381 | AS1,AVAR,2
382 | AS1,DA1,2
383 | AS1,MDL05,3
384 | AS1,MDL08,3
385 | AS1,MDR05,3
386 | AS1,MDR08,4
387 | AS1,VA3,1
388 | AS1,VD1,5
389 | AS1,VD2,1
390 | AS10,AVAL,1
391 | AS10,AVAR,1
392 | AS10,MDL19,3
393 | AS10,MDL20,2
394 | AS10,MDR19,3
395 | AS10,MDR20,2
396 | AS11,MDL21,1
397 | AS11,MDL22,1
398 | AS11,MDL23,1
399 | AS11,MDL24,1
400 | AS11,MDR21,1
401 | AS11,MDR22,1
402 | AS11,MDR23,1
403 | AS11,MDR24,1
404 | AS11,PDA,1
405 | AS11,PDB,1
406 | AS11,PDB,2
407 | AS11,VD13,2
408 | AS2,DA2,1
409 | AS2,DB1,1
410 | AS2,DD1,1
411 | AS2,MDL07,3
412 | AS2,MDL08,2
413 | AS2,MDR07,3
414 | AS2,MDR08,3
415 | AS2,VA4,2
416 | AS2,VD2,10
417 | AS3,AVAL,2
418 | AS3,AVAR,1
419 | AS3,DA2,1
420 | AS3,DA3,1
421 | AS3,DD1,1
422 | AS3,MDL09,3
423 | AS3,MDL10,3
424 | AS3,MDR09,3
425 | AS3,MDR10,3
426 | AS3,VA5,2
427 | AS3,VD2,1
428 | AS3,VD3,15
429 | AS4,AS5,1
430 | AS4,DA3,1
431 | AS4,MDL11,2
432 | AS4,MDL12,2
433 | AS4,MDR11,3
434 | AS4,MDR12,2
435 | AS4,VD4,11
436 | AS5,AVAL,1
437 | AS5,AVAR,1
438 | AS5,DD2,1
439 | AS5,MDL11,2
440 | AS5,MDL14,3
441 | AS5,MDR11,2
442 | AS5,MDR14,3
443 | AS5,VA7,1
444 | AS5,VD5,9
445 | AS6,AVAL,1
446 | AS6,AVAR,1
447 | AS6,AVBR,1
448 | AS6,DA5,2
449 | AS6,MDL13,3
450 | AS6,MDL14,2
451 | AS6,MDR13,3
452 | AS6,MDR14,2
453 | AS6,VA8,1
454 | AS6,VD6,13
455 | AS7,AVAL,6
456 | AS7,AVAR,5
457 | AS7,AVBL,2
458 | AS7,AVBR,2
459 | AS7,MDL13,2
460 | AS7,MDL16,3
461 | AS7,MDR13,2
462 | AS7,MDR16,3
463 | AS8,AVAL,4
464 | AS8,AVAR,3
465 | AS8,MDL15,2
466 | AS8,MDL18,3
467 | AS8,MDR15,2
468 | AS8,MDR18,3
469 | AS9,AVAL,4
470 | AS9,AVAR,1
471 | AS9,AVAR,1
472 | AS9,DVB,7
473 | AS9,MDL17,2
474 | AS9,MDL20,3
475 | AS9,MDR17,2
476 | AS9,MDR20,3
477 | ASEL,ADFR,1
478 | ASEL,AIAL,3
479 | ASEL,AIBL,7
480 | ASEL,AIBR,2
481 | ASEL,AIYL,13
482 | ASEL,AIYR,6
483 | ASEL,AWCL,4
484 | ASEL,AWCR,1
485 | ASEL,RIAR,1
486 | ASER,AFDL,1
487 | ASER,AFDR,2
488 | ASER,AIAL,1
489 | ASER,AIAR,3
490 | ASER,AIBL,2
491 | ASER,AIBR,10
492 | ASER,AIYL,2
493 | ASER,AIYR,14
494 | ASER,AWAR,1
495 | ASER,AWCL,1
496 | ASER,AWCR,1
497 | ASGL,AIAL,9
498 | ASGL,AIBL,3
499 | ASGL,AINR,1
500 | ASGL,AINR,1
501 | ASGL,AIZL,1
502 | ASGL,ASKL,1
503 | ASGR,AIAR,10
504 | ASGR,AIBR,2
505 | ASGR,AINL,1
506 | ASGR,AIYR,1
507 | ASGR,AIZR,1
508 | ASHL,ADAL,1
509 | ASHL,ADAL,1
510 | ASHL,ADFL,3
511 | ASHL,AIAL,7
512 | ASHL,AIBL,5
513 | ASHL,AIZL,1
514 | ASHL,ASHR,1
515 | ASHL,ASKL,1
516 | ASHL,AVAL,2
517 | ASHL,AVBL,6
518 | ASHL,AVDL,2
519 | ASHL,AVDR,2
520 | ASHL,RIAL,4
521 | ASHL,RICL,2
522 | ASHL,RIML,1
523 | ASHL,RIPL,1
524 | ASHL,RMGL,1
525 | ASHR,ADAR,2
526 | ASHR,ADAR,1
527 | ASHR,ADFR,2
528 | ASHR,AIAR,10
529 | ASHR,AIBR,3
530 | ASHR,AIZR,1
531 | ASHR,ASHL,1
532 | ASHR,ASKR,1
533 | ASHR,AVAR,5
534 | ASHR,AVBR,3
535 | ASHR,AVDL,5
536 | ASHR,AVDR,1
537 | ASHR,AVER,3
538 | ASHR,HSNR,1
539 | ASHR,PVPR,1
540 | ASHR,RIAR,2
541 | ASHR,RICR,2
542 | ASHR,RMGR,2
543 | ASHR,RMGR,1
544 | ASIL,AIAL,2
545 | ASIL,AIBL,1
546 | ASIL,AIYL,2
547 | ASIL,AIZL,1
548 | ASIL,ASER,1
549 | ASIL,ASIR,1
550 | ASIL,ASKL,2
551 | ASIL,AWCL,1
552 | ASIL,AWCR,1
553 | ASIL,RIBL,1
554 | ASIR,AIAL,1
555 | ASIR,AIAR,3
556 | ASIR,AIAR,2
557 | ASIR,AIBR,1
558 | ASIR,ASEL,2
559 | ASIR,ASHR,1
560 | ASIR,ASIL,1
561 | ASIR,AWCL,1
562 | ASIR,AWCR,1
563 | ASJL,ASJR,1
564 | ASJL,ASKL,4
565 | ASJL,HSNL,1
566 | ASJL,HSNR,1
567 | ASJL,PVQL,14
568 | ASJR,ASJL,1
569 | ASJR,ASKR,4
570 | ASJR,HSNR,1
571 | ASJR,PVQR,13
572 | ASKL,AIAL,11
573 | ASKL,AIBL,2
574 | ASKL,AIML,2
575 | ASKL,ASKR,1
576 | ASKL,PVQL,5
577 | ASKL,RMGL,1
578 | ASKR,AIAR,11
579 | ASKR,AIMR,1
580 | ASKR,ASHR,1
581 | ASKR,ASKL,1
582 | ASKR,AWAR,1
583 | ASKR,CEPVR,1
584 | ASKR,PVQR,4
585 | ASKR,RIFR,1
586 | ASKR,RMGR,1
587 | AUAL,AINR,1
588 | AUAL,AUAR,1
589 | AUAL,AVAL,3
590 | AUAL,AVDR,1
591 | AUAL,AVEL,3
592 | AUAL,AWBL,1
593 | AUAL,RIAL,5
594 | AUAL,RIBL,9
595 | AUAR,AINL,1
596 | AUAR,AIYR,1
597 | AUAR,AUAL,1
598 | AUAR,AVAR,1
599 | AUAR,AVER,4
600 | AUAR,AWBR,1
601 | AUAR,RIAR,6
602 | AUAR,RIBR,13
603 | AUAR,URXR,1
604 | AVAL,AS1,3
605 | AVAL,AS10,2
606 | AVAL,AS10,1
607 | AVAL,AS11,4
608 | AVAL,AS2,1
609 | AVAL,AS3,1
610 | AVAL,AS3,2
611 | AVAL,AS4,1
612 | AVAL,AS5,3
613 | AVAL,AS5,1
614 | AVAL,AS6,1
615 | AVAL,AS7,8
616 | AVAL,AS7,6
617 | AVAL,AS8,5
618 | AVAL,AS8,4
619 | AVAL,AS9,8
620 | AVAL,AS9,4
621 | AVAL,AVAR,2
622 | AVAL,AVAR,5
623 | AVAL,AVBR,1
624 | AVAL,AVDL,1
625 | AVAL,AVHL,1
626 | AVAL,AVJL,2
627 | AVAL,DA1,2
628 | AVAL,DA1,2
629 | AVAL,DA2,2
630 | AVAL,DA2,2
631 | AVAL,DA3,6
632 | AVAL,DA4,7
633 | AVAL,DA4,3
634 | AVAL,DA5,7
635 | AVAL,DA5,1
636 | AVAL,DA6,11
637 | AVAL,DA6,10
638 | AVAL,DA7,2
639 | AVAL,DA7,2
640 | AVAL,DA8,4
641 | AVAL,DA9,3
642 | AVAL,DB5,2
643 | AVAL,DB6,1
644 | AVAL,DB6,3
645 | AVAL,FLPL,1
646 | AVAL,LUAL,1
647 | AVAL,LUAL,1
648 | AVAL,PVCL,10
649 | AVAL,PVCL,2
650 | AVAL,PVCR,6
651 | AVAL,PVCR,5
652 | AVAL,PVPL,1
653 | AVAL,RIMR,3
654 | AVAL,SABD,4
655 | AVAL,SABVR,1
656 | AVAL,SDQR,1
657 | AVAL,URYDL,1
658 | AVAL,URYVR,1
659 | AVAL,VA1,3
660 | AVAL,VA10,5
661 | AVAL,VA10,1
662 | AVAL,VA11,6
663 | AVAL,VA11,1
664 | AVAL,VA12,2
665 | AVAL,VA2,1
666 | AVAL,VA2,4
667 | AVAL,VA3,2
668 | AVAL,VA3,1
669 | AVAL,VA4,2
670 | AVAL,VA4,1
671 | AVAL,VA5,3
672 | AVAL,VA5,5
673 | AVAL,VA6,4
674 | AVAL,VA6,6
675 | AVAL,VA7,2
676 | AVAL,VA8,9
677 | AVAL,VA8,10
678 | AVAL,VA9,7
679 | AVAL,VA9,1
680 | AVAL,VB9,5
681 | AVAR,ADER,1
682 | AVAR,AS1,1
683 | AVAR,AS1,2
684 | AVAR,AS10,1
685 | AVAR,AS10,1
686 | AVAR,AS11,6
687 | AVAR,AS2,2
688 | AVAR,AS3,1
689 | AVAR,AS3,1
690 | AVAR,AS4,1
691 | AVAR,AS5,1
692 | AVAR,AS5,1
693 | AVAR,AS6,2
694 | AVAR,AS6,1
695 | AVAR,AS7,3
696 | AVAR,AS7,5
697 | AVAR,AS8,6
698 | AVAR,AS8,3
699 | AVAR,AS9,5
700 | AVAR,AS9,1
701 | AVAR,AVAL,1
702 | AVAR,AVAL,5
703 | AVAR,AVBL,1
704 | AVAR,AVDL,1
705 | AVAR,AVDR,2
706 | AVAR,AVEL,2
707 | AVAR,AVER,2
708 | AVAR,DA1,2
709 | AVAR,DA1,6
710 | AVAR,DA2,2
711 | AVAR,DA2,2
712 | AVAR,DA3,3
713 | AVAR,DA3,2
714 | AVAR,DA4,6
715 | AVAR,DA4,2
716 | AVAR,DA5,2
717 | AVAR,DA5,5
718 | AVAR,DA6,11
719 | AVAR,DA6,2
720 | AVAR,DA7,3
721 | AVAR,DA8,8
722 | AVAR,DA8,1
723 | AVAR,DA9,2
724 | AVAR,DB3,1
725 | AVAR,DB5,1
726 | AVAR,DB5,2
727 | AVAR,DB6,5
728 | AVAR,LUAL,1
729 | AVAR,LUAR,3
730 | AVAR,PDEL,1
731 | AVAR,PDER,1
732 | AVAR,PVCL,7
733 | AVAR,PVCR,5
734 | AVAR,PVCR,3
735 | AVAR,RIGL,1
736 | AVAR,RIML,2
737 | AVAR,RIMR,1
738 | AVAR,SABD,1
739 | AVAR,SABVL,3
740 | AVAR,SABVL,3
741 | AVAR,SABVR,1
742 | AVAR,URYDR,1
743 | AVAR,URYVL,1
744 | AVAR,VA10,4
745 | AVAR,VA10,1
746 | AVAR,VA11,8
747 | AVAR,VA11,7
748 | AVAR,VA12,1
749 | AVAR,VA2,2
750 | AVAR,VA3,5
751 | AVAR,VA3,2
752 | AVAR,VA4,2
753 | AVAR,VA4,3
754 | AVAR,VA5,1
755 | AVAR,VA5,3
756 | AVAR,VA6,3
757 | AVAR,VA6,2
758 | AVAR,VA7,4
759 | AVAR,VA8,12
760 | AVAR,VA8,4
761 | AVAR,VA9,6
762 | AVAR,VB9,4
763 | AVAR,VD13,2
764 | AVBL,AQR,1
765 | AVBL,AS10,1
766 | AVBL,AS3,1
767 | AVBL,AS4,1
768 | AVBL,AS5,1
769 | AVBL,AS6,1
770 | AVBL,AS7,2
771 | AVBL,AS9,1
772 | AVBL,AVAL,7
773 | AVBL,AVAR,7
774 | AVBL,AVBR,1
775 | AVBL,AVBR,3
776 | AVBL,AVDL,1
777 | AVBL,AVDR,2
778 | AVBL,AVEL,1
779 | AVBL,AVER,2
780 | AVBL,AVL,1
781 | AVBL,DB3,1
782 | AVBL,DB4,1
783 | AVBL,DB5,1
784 | AVBL,DB6,2
785 | AVBL,DB7,2
786 | AVBL,DVA,1
787 | AVBL,PVNR,1
788 | AVBL,RIBL,1
789 | AVBL,RIBR,1
790 | AVBL,RID,1
791 | AVBL,SDQR,1
792 | AVBL,SIBVL,1
793 | AVBL,VA10,1
794 | AVBL,VA2,1
795 | AVBL,VA7,1
796 | AVBL,VB1,1
797 | AVBL,VB10,2
798 | AVBL,VB11,2
799 | AVBL,VB2,1
800 | AVBL,VB2,3
801 | AVBL,VB4,1
802 | AVBL,VB5,1
803 | AVBL,VB6,1
804 | AVBL,VB7,2
805 | AVBL,VB8,7
806 | AVBL,VB9,1
807 | AVBL,VC3,1
808 | AVBR,AS1,1
809 | AVBR,AS10,1
810 | AVBR,AS3,1
811 | AVBR,AS4,1
812 | AVBR,AS5,1
813 | AVBR,AS6,1
814 | AVBR,AS6,1
815 | AVBR,AS7,1
816 | AVBR,AS7,2
817 | AVBR,AVAL,6
818 | AVBR,AVAR,7
819 | AVBR,AVBL,1
820 | AVBR,AVBL,3
821 | AVBR,DA5,1
822 | AVBR,DB1,3
823 | AVBR,DB2,1
824 | AVBR,DB3,1
825 | AVBR,DB4,1
826 | AVBR,DB5,1
827 | AVBR,DB6,1
828 | AVBR,DB7,1
829 | AVBR,DD1,1
830 | AVBR,DVA,1
831 | AVBR,HSNR,1
832 | AVBR,PVNL,2
833 | AVBR,RIBL,1
834 | AVBR,RIBR,1
835 | AVBR,RID,2
836 | AVBR,SIBVL,1
837 | AVBR,VA4,1
838 | AVBR,VA8,1
839 | AVBR,VA9,1
840 | AVBR,VA9,1
841 | AVBR,VB10,1
842 | AVBR,VB11,1
843 | AVBR,VB2,1
844 | AVBR,VB3,1
845 | AVBR,VB4,1
846 | AVBR,VB6,2
847 | AVBR,VB7,2
848 | AVBR,VB8,3
849 | AVBR,VB9,6
850 | AVBR,VD10,1
851 | AVBR,VD3,1
852 | AVDL,ADAR,2
853 | AVDL,AS1,1
854 | AVDL,AS10,1
855 | AVDL,AS11,2
856 | AVDL,AS4,1
857 | AVDL,AS5,1
858 | AVDL,AVAL,13
859 | AVDL,AVAR,19
860 | AVDL,AVM,2
861 | AVDL,DA1,1
862 | AVDL,DA2,1
863 | AVDL,DA3,4
864 | AVDL,DA4,1
865 | AVDL,DA5,1
866 | AVDL,DA8,1
867 | AVDL,FLPL,1
868 | AVDL,FLPR,1
869 | AVDL,LUAL,1
870 | AVDL,PVCL,1
871 | AVDL,SABD,1
872 | AVDL,SABVL,1
873 | AVDL,SABVR,1
874 | AVDL,VA5,1
875 | AVDR,ADAL,2
876 | AVDR,ADLL,1
877 | AVDR,AS10,1
878 | AVDR,AS5,1
879 | AVDR,AVAL,16
880 | AVDR,AVAR,15
881 | AVDR,AVBL,1
882 | AVDR,AVDL,2
883 | AVDR,AVJL,2
884 | AVDR,DA1,2
885 | AVDR,DA2,1
886 | AVDR,DA3,1
887 | AVDR,DA4,1
888 | AVDR,DA5,2
889 | AVDR,DA8,1
890 | AVDR,DA9,1
891 | AVDR,DB4,1
892 | AVDR,DVC,1
893 | AVDR,FLPR,1
894 | AVDR,LUAL,2
895 | AVDR,PQR,1
896 | AVDR,SABD,1
897 | AVDR,SABVL,3
898 | AVDR,SABVR,1
899 | AVDR,VA11,1
900 | AVDR,VA2,1
901 | AVDR,VA3,2
902 | AVDR,VA6,1
903 | AVEL,AS1,1
904 | AVEL,AVAL,12
905 | AVEL,AVAR,7
906 | AVEL,AVER,1
907 | AVEL,DA1,5
908 | AVEL,DA2,1
909 | AVEL,DA3,3
910 | AVEL,DA4,1
911 | AVEL,PVCR,1
912 | AVEL,PVT,1
913 | AVEL,RIML,2
914 | AVEL,RIMR,3
915 | AVEL,RMDVR,1
916 | AVEL,RMEV,1
917 | AVEL,SABD,6
918 | AVEL,SABVL,7
919 | AVEL,SABVR,3
920 | AVEL,VA1,5
921 | AVEL,VA3,3
922 | AVEL,VD2,1
923 | AVEL,VD3,1
924 | AVER,AS1,3
925 | AVER,AS2,2
926 | AVER,AS3,1
927 | AVER,AVAL,7
928 | AVER,AVAR,16
929 | AVER,AVDR,1
930 | AVER,AVEL,1
931 | AVER,DA1,5
932 | AVER,DA2,3
933 | AVER,DA3,1
934 | AVER,DB3,1
935 | AVER,RIML,3
936 | AVER,RIMR,2
937 | AVER,RMDVL,1
938 | AVER,RMDVR,1
939 | AVER,RMEV,1
940 | AVER,SABD,2
941 | AVER,SABVL,3
942 | AVER,SABVR,3
943 | AVER,VA1,1
944 | AVER,VA2,1
945 | AVER,VA3,2
946 | AVER,VA4,1
947 | AVER,VA5,1
948 | AVFL,AVBL,1
949 | AVFL,AVBR,2
950 | AVFL,AVFR,7
951 | AVFL,AVFR,23
952 | AVFL,AVG,1
953 | AVFL,AVHL,2
954 | AVFL,AVHL,2
955 | AVFL,AVHR,4
956 | AVFL,AVHR,3
957 | AVFL,AVJL,1
958 | AVFL,AVJR,1
959 | AVFL,AVL,1
960 | AVFL,HSNL,1
961 | AVFL,MVL11,1
962 | AVFL,MVL12,1
963 | AVFL,PDER,1
964 | AVFL,PVNL,2
965 | AVFL,PVQL,1
966 | AVFL,PVQR,1
967 | AVFL,PVQR,1
968 | AVFL,VB1,1
969 | AVFR,ASJL,1
970 | AVFR,ASKL,1
971 | AVFR,AVBL,1
972 | AVFR,AVBR,5
973 | AVFR,AVFL,1
974 | AVFR,AVFL,23
975 | AVFR,AVHL,2
976 | AVFR,AVHL,2
977 | AVFR,AVHR,1
978 | AVFR,AVHR,1
979 | AVFR,AVJL,1
980 | AVFR,AVJR,1
981 | AVFR,HSNR,1
982 | AVFR,MVL14,2
983 | AVFR,MVR14,2
984 | AVFR,PVQL,1
985 | AVFR,VC4,1
986 | AVFR,VD11,1
987 | AVG,AVAR,3
988 | AVG,AVBL,1
989 | AVG,AVBR,2
990 | AVG,AVDR,1
991 | AVG,AVEL,1
992 | AVG,AVER,1
993 | AVG,AVFL,1
994 | AVG,AVJL,1
995 | AVG,AVL,1
996 | AVG,DA8,1
997 | AVG,PHAL,2
998 | AVG,PVCL,1
999 | AVG,PVNR,1
1000 | AVG,PVPR,1
1001 | AVG,PVQR,1
1002 | AVG,PVT,1
1003 | AVG,RIFL,1
1004 | AVG,RIFR,1
1005 | AVG,VA11,1
1006 | AVHL,ADFR,3
1007 | AVHL,AVBL,1
1008 | AVHL,AVBR,1
1009 | AVHL,AVDL,1
1010 | AVHL,AVFL,1
1011 | AVHL,AVFL,2
1012 | AVHL,AVFR,3
1013 | AVHL,AVFR,2
1014 | AVHL,AVHR,1
1015 | AVHL,AVHR,1
1016 | AVHL,AVJL,3
1017 | AVHL,AWBR,1
1018 | AVHL,PHBR,1
1019 | AVHL,PVPR,2
1020 | AVHL,PVQL,1
1021 | AVHL,PVQR,2
1022 | AVHL,RIMR,1
1023 | AVHL,RIR,3
1024 | AVHL,SMBDR,1
1025 | AVHL,SMBVR,2
1026 | AVHL,VD1,1
1027 | AVHR,ADLL,1
1028 | AVHR,ADLR,2
1029 | AVHR,AQR,2
1030 | AVHR,AVBL,2
1031 | AVHR,AVBR,1
1032 | AVHR,AVDR,1
1033 | AVHR,AVFL,2
1034 | AVHR,AVFL,3
1035 | AVHR,AVFR,1
1036 | AVHR,AVFR,1
1037 | AVHR,AVHL,1
1038 | AVHR,AVHL,1
1039 | AVHR,AVJR,4
1040 | AVHR,PVNL,1
1041 | AVHR,PVPL,3
1042 | AVHR,RIGL,1
1043 | AVHR,RIR,4
1044 | AVHR,SMBDL,1
1045 | AVHR,SMBVL,1
1046 | AVJL,AVAL,2
1047 | AVJL,AVAR,1
1048 | AVJL,AVBL,1
1049 | AVJL,AVBR,4
1050 | AVJL,AVDL,1
1051 | AVJL,AVDR,2
1052 | AVJL,AVEL,1
1053 | AVJL,AVFR,1
1054 | AVJL,AVHL,2
1055 | AVJL,AVJR,4
1056 | AVJL,HSNR,1
1057 | AVJL,PLMR,2
1058 | AVJL,PVCL,1
1059 | AVJL,PVCL,1
1060 | AVJL,PVCR,2
1061 | AVJL,PVCR,3
1062 | AVJL,PVNR,1
1063 | AVJL,RIFR,1
1064 | AVJL,RIS,1
1065 | AVJL,RIS,1
1066 | AVJR,AVAL,1
1067 | AVJR,AVAR,1
1068 | AVJR,AVBL,3
1069 | AVJR,AVBR,1
1070 | AVJR,AVDL,1
1071 | AVJR,AVDR,3
1072 | AVJR,AVER,3
1073 | AVJR,AVJL,1
1074 | AVJR,AVJL,4
1075 | AVJR,PVCL,2
1076 | AVJR,PVCL,1
1077 | AVJR,PVCR,4
1078 | AVJR,PVQR,1
1079 | AVJR,SABVL,1
1080 | AVKL,ADER,1
1081 | AVKL,AQR,2
1082 | AVKL,AVBL,1
1083 | AVKL,AVEL,2
1084 | AVKL,AVER,1
1085 | AVKL,AVKR,2
1086 | AVKL,AVM,1
1087 | AVKL,DVA,1
1088 | AVKL,PDEL,3
1089 | AVKL,PDER,1
1090 | AVKL,PVM,1
1091 | AVKL,PVPL,1
1092 | AVKL,PVPR,1
1093 | AVKL,PVT,2
1094 | AVKL,RICL,1
1095 | AVKL,RICR,1
1096 | AVKL,RIGL,1
1097 | AVKL,RIML,2
1098 | AVKL,RIMR,1
1099 | AVKL,RMFR,1
1100 | AVKL,SAADR,1
1101 | AVKL,SIAVR,1
1102 | AVKL,SMBDL,1
1103 | AVKL,SMBDR,1
1104 | AVKL,SMBVR,1
1105 | AVKL,SMDDR,1
1106 | AVKL,VB1,4
1107 | AVKL,VB10,1
1108 | AVKR,ADEL,1
1109 | AVKR,AQR,1
1110 | AVKR,AVKL,2
1111 | AVKR,BDUL,1
1112 | AVKR,MVL10,1
1113 | AVKR,PVPL,6
1114 | AVKR,PVQL,1
1115 | AVKR,RICL,1
1116 | AVKR,RIGR,1
1117 | AVKR,RIML,2
1118 | AVKR,RIMR,2
1119 | AVKR,RMDR,1
1120 | AVKR,RMFL,1
1121 | AVKR,SAADL,1
1122 | AVKR,SMBDL,1
1123 | AVKR,SMBDL,1
1124 | AVKR,SMBDR,2
1125 | AVKR,SMBVR,1
1126 | AVKR,SMDDL,1
1127 | AVKR,SMDDR,2
1128 | AVL,AVEL,1
1129 | AVL,AVFR,1
1130 | AVL,DA2,1
1131 | AVL,DD1,1
1132 | AVL,DD6,2
1133 | AVL,DVB,1
1134 | AVL,DVC,9
1135 | AVL,HSNR,1
1136 | AVL,MVL10,-5
1137 | AVL,MVR10,-5
1138 | AVL,PVM,1
1139 | AVL,PVPR,1
1140 | AVL,PVWL,1
1141 | AVL,SABD,5
1142 | AVL,SABVL,4
1143 | AVL,SABVR,3
1144 | AVL,VD12,4
1145 | AVM,ADER,1
1146 | AVM,ALML,1
1147 | AVM,ALMR,1
1148 | AVM,AVBL,6
1149 | AVM,AVBR,6
1150 | AVM,AVDL,2
1151 | AVM,AVJR,1
1152 | AVM,BDUL,3
1153 | AVM,BDUR,2
1154 | AVM,DA1,1
1155 | AVM,PVCL,4
1156 | AVM,PVCR,5
1157 | AVM,PVNL,1
1158 | AVM,PVR,3
1159 | AVM,RID,1
1160 | AVM,SIBVL,1
1161 | AVM,VA1,2
1162 | AWAL,ADAL,1
1163 | AWAL,AFDL,5
1164 | AWAL,AIAL,1
1165 | AWAL,AIYL,1
1166 | AWAL,AIZL,10
1167 | AWAL,ASEL,4
1168 | AWAL,ASGL,1
1169 | AWAL,AWAR,1
1170 | AWAL,AWBL,1
1171 | AWAR,ADFR,3
1172 | AWAR,AFDR,7
1173 | AWAR,AIAR,1
1174 | AWAR,AIYR,2
1175 | AWAR,AIZR,7
1176 | AWAR,AIZR,1
1177 | AWAR,ASEL,1
1178 | AWAR,ASER,2
1179 | AWAR,AUAR,1
1180 | AWAR,AWAL,1
1181 | AWAR,AWBR,1
1182 | AWAR,RIFR,2
1183 | AWAR,RIGR,1
1184 | AWAR,RIR,2
1185 | AWBL,ADFL,9
1186 | AWBL,AIBR,1
1187 | AWBL,AIZL,9
1188 | AWBL,AUAL,1
1189 | AWBL,AVBL,1
1190 | AWBL,AWBR,1
1191 | AWBL,RIAL,3
1192 | AWBL,RMGL,1
1193 | AWBL,SMBDL,1
1194 | AWBR,ADFR,4
1195 | AWBR,AIZR,4
1196 | AWBR,ASGR,1
1197 | AWBR,ASHR,2
1198 | AWBR,AUAR,1
1199 | AWBR,AVBR,2
1200 | AWBR,AWBL,1
1201 | AWBR,RIAR,1
1202 | AWBR,RICL,1
1203 | AWBR,RIR,2
1204 | AWBR,RMGR,1
1205 | AWBR,SMBVR,1
1206 | AWCL,AIAL,2
1207 | AWCL,AIAR,4
1208 | AWCL,AIBL,1
1209 | AWCL,AIBR,1
1210 | AWCL,AIYL,10
1211 | AWCL,ASEL,1
1212 | AWCL,AVAL,1
1213 | AWCL,AWCR,1
1214 | AWCL,RIAL,3
1215 | AWCR,AIAR,1
1216 | AWCR,AIBR,4
1217 | AWCR,AIYL,4
1218 | AWCR,AIYR,9
1219 | AWCR,ASEL,1
1220 | AWCR,ASGR,1
1221 | AWCR,AWCL,5
1222 | BAGL,AIBL,1
1223 | BAGL,AVAR,1
1224 | BAGL,AVEL,1
1225 | BAGL,AVER,4
1226 | BAGL,BAGR,1
1227 | BAGL,BAGR,1
1228 | BAGL,RIAR,5
1229 | BAGL,RIBL,1
1230 | BAGL,RIBR,7
1231 | BAGL,RIGL,1
1232 | BAGL,RIGR,4
1233 | BAGL,RIGR,1
1234 | BAGL,RIR,1
1235 | BAGR,AIYL,1
1236 | BAGR,AVAL,1
1237 | BAGR,AVEL,2
1238 | BAGR,BAGL,1
1239 | BAGR,RIAL,5
1240 | BAGR,RIBL,4
1241 | BAGR,RIGL,5
1242 | BAGR,RIGL,1
1243 | BAGR,RIR,1
1244 | BDUL,ADEL,3
1245 | BDUL,AVHL,1
1246 | BDUL,AVJR,1
1247 | BDUL,HSNL,1
1248 | BDUL,PVNL,2
1249 | BDUL,PVNR,2
1250 | BDUL,SAADL,1
1251 | BDUL,URADL,1
1252 | BDUR,ADER,1
1253 | BDUR,ALMR,1
1254 | BDUR,AVAL,3
1255 | BDUR,AVHL,1
1256 | BDUR,AVJL,2
1257 | BDUR,HSNR,4
1258 | BDUR,PVCL,1
1259 | BDUR,PVNL,2
1260 | BDUR,PVNR,1
1261 | BDUR,SDQL,1
1262 | BDUR,URADR,1
1263 | CEPDL,AVER,5
1264 | CEPDL,IL1DL,4
1265 | CEPDL,OLLL,2
1266 | CEPDL,OLQDL,6
1267 | CEPDL,OLQDL,1
1268 | CEPDL,RIBL,2
1269 | CEPDL,RICL,1
1270 | CEPDL,RICR,2
1271 | CEPDL,RIH,1
1272 | CEPDL,RIPL,2
1273 | CEPDL,RIS,1
1274 | CEPDL,RMDVL,3
1275 | CEPDL,RMGL,4
1276 | CEPDL,RMHR,4
1277 | CEPDL,SIADR,1
1278 | CEPDL,SMBDR,1
1279 | CEPDL,URADL,2
1280 | CEPDL,URBL,4
1281 | CEPDL,URYDL,2
1282 | CEPDR,AVEL,6
1283 | CEPDR,BDUR,1
1284 | CEPDR,IL1DR,5
1285 | CEPDR,IL1R,1
1286 | CEPDR,OLLR,8
1287 | CEPDR,OLQDR,5
1288 | CEPDR,OLQDR,2
1289 | CEPDR,RIBR,1
1290 | CEPDR,RICL,4
1291 | CEPDR,RICR,3
1292 | CEPDR,RIH,1
1293 | CEPDR,RIS,1
1294 | CEPDR,RMDDL,1
1295 | CEPDR,RMDVR,2
1296 | CEPDR,RMGR,1
1297 | CEPDR,RMHL,4
1298 | CEPDR,RMHR,1
1299 | CEPDR,SIADL,1
1300 | CEPDR,SMBDR,1
1301 | CEPDR,URADR,1
1302 | CEPDR,URBR,2
1303 | CEPDR,URYDR,1
1304 | CEPVL,ADLL,1
1305 | CEPVL,AVER,3
1306 | CEPVL,IL1VL,2
1307 | CEPVL,MVL03,1
1308 | CEPVL,OLLL,4
1309 | CEPVL,OLQVL,6
1310 | CEPVL,OLQVL,1
1311 | CEPVL,RICL,7
1312 | CEPVL,RICR,4
1313 | CEPVL,RIH,1
1314 | CEPVL,RIPL,1
1315 | CEPVL,RMDDL,4
1316 | CEPVL,RMHL,1
1317 | CEPVL,SIAVL,1
1318 | CEPVL,URAVL,2
1319 | CEPVR,ASGR,1
1320 | CEPVR,AVEL,5
1321 | CEPVR,IL1VR,1
1322 | CEPVR,IL2VR,2
1323 | CEPVR,MVR04,1
1324 | CEPVR,OLLR,7
1325 | CEPVR,OLQVR,3
1326 | CEPVR,OLQVR,1
1327 | CEPVR,RICL,2
1328 | CEPVR,RICR,2
1329 | CEPVR,RIH,1
1330 | CEPVR,RIPR,1
1331 | CEPVR,RIVL,1
1332 | CEPVR,RMDDR,2
1333 | CEPVR,RMHR,2
1334 | CEPVR,SIAVR,2
1335 | CEPVR,URAVR,1
1336 | DA1,AVAL,2
1337 | DA1,AVAR,6
1338 | DA1,DA4,1
1339 | DA1,DD1,4
1340 | DA1,MDL08,8
1341 | DA1,MDR08,8
1342 | DA1,SABVL,2
1343 | DA1,SABVR,3
1344 | DA1,VD1,17
1345 | DA1,VD2,1
1346 | DA2,AS2,1
1347 | DA2,AS3,1
1348 | DA2,AVAL,2
1349 | DA2,AVAR,2
1350 | DA2,DD1,1
1351 | DA2,MDL07,2
1352 | DA2,MDL08,1
1353 | DA2,MDL09,2
1354 | DA2,MDL10,2
1355 | DA2,MDR07,2
1356 | DA2,MDR08,2
1357 | DA2,MDR09,2
1358 | DA2,MDR10,2
1359 | DA2,SABVL,1
1360 | DA2,VA1,2
1361 | DA2,VD1,2
1362 | DA2,VD2,11
1363 | DA2,VD3,5
1364 | DA3,AS4,1
1365 | DA3,AS4,1
1366 | DA3,AVAR,2
1367 | DA3,DA4,2
1368 | DA3,DB3,1
1369 | DA3,DD2,1
1370 | DA3,MDL09,5
1371 | DA3,MDL10,5
1372 | DA3,MDL12,5
1373 | DA3,MDR09,5
1374 | DA3,MDR10,5
1375 | DA3,MDR12,5
1376 | DA3,VD3,25
1377 | DA3,VD4,6
1378 | DA4,AVAL,3
1379 | DA4,AVAR,2
1380 | DA4,DA1,1
1381 | DA4,DA3,1
1382 | DA4,DB3,1
1383 | DA4,DB3,1
1384 | DA4,DD2,1
1385 | DA4,MDL11,4
1386 | DA4,MDL12,4
1387 | DA4,MDL14,5
1388 | DA4,MDR11,4
1389 | DA4,MDR12,4
1390 | DA4,MDR14,5
1391 | DA4,VB6,1
1392 | DA4,VD4,12
1393 | DA4,VD5,15
1394 | DA5,AS6,2
1395 | DA5,AVAL,1
1396 | DA5,AVAR,5
1397 | DA5,DB4,1
1398 | DA5,MDL13,5
1399 | DA5,MDL14,4
1400 | DA5,MDR13,5
1401 | DA5,MDR14,4
1402 | DA5,VA4,1
1403 | DA5,VA5,2
1404 | DA5,VD5,1
1405 | DA5,VD6,16
1406 | DA6,AVAL,10
1407 | DA6,AVAR,2
1408 | DA6,MDL11,6
1409 | DA6,MDL12,4
1410 | DA6,MDL13,4
1411 | DA6,MDL14,4
1412 | DA6,MDL16,4
1413 | DA6,MDR11,4
1414 | DA6,MDR12,4
1415 | DA6,MDR13,4
1416 | DA6,MDR14,4
1417 | DA6,MDR16,4
1418 | DA6,VD4,4
1419 | DA6,VD5,3
1420 | DA6,VD6,3
1421 | DA7,AVAL,2
1422 | DA7,MDL15,4
1423 | DA7,MDL17,4
1424 | DA7,MDL18,4
1425 | DA7,MDR15,4
1426 | DA7,MDR17,4
1427 | DA7,MDR18,4
1428 | DA8,AVAR,1
1429 | DA8,DA9,1
1430 | DA8,MDL17,4
1431 | DA8,MDL19,4
1432 | DA8,MDL20,4
1433 | DA8,MDR17,4
1434 | DA8,MDR19,4
1435 | DA8,MDR20,4
1436 | DA9,DA8,1
1437 | DA9,DD6,1
1438 | DA9,MDL19,4
1439 | DA9,MDL21,4
1440 | DA9,MDL22,4
1441 | DA9,MDL23,4
1442 | DA9,MDL24,4
1443 | DA9,MDR19,4
1444 | DA9,MDR21,4
1445 | DA9,MDR22,4
1446 | DA9,MDR23,4
1447 | DA9,MDR24,4
1448 | DA9,PDA,1
1449 | DA9,PHCL,1
1450 | DA9,RID,1
1451 | DA9,VD13,1
1452 | DB1,AIBR,1
1453 | DB1,AS1,1
1454 | DB1,AS2,1
1455 | DB1,AS3,1
1456 | DB1,AVBR,3
1457 | DB1,DB2,1
1458 | DB1,DB4,1
1459 | DB1,DD1,10
1460 | DB1,DVA,1
1461 | DB1,MDL07,1
1462 | DB1,MDL08,1
1463 | DB1,MDR07,1
1464 | DB1,MDR08,1
1465 | DB1,RID,1
1466 | DB1,RIS,1
1467 | DB1,VB3,1
1468 | DB1,VB4,1
1469 | DB1,VD1,21
1470 | DB1,VD2,15
1471 | DB1,VD3,1
1472 | DB2,AVBR,1
1473 | DB2,DA3,5
1474 | DB2,DB1,1
1475 | DB2,DB3,6
1476 | DB2,DD2,2
1477 | DB2,MDL09,3
1478 | DB2,MDL10,3
1479 | DB2,MDL11,3
1480 | DB2,MDL12,3
1481 | DB2,MDR09,3
1482 | DB2,MDR10,3
1483 | DB2,MDR11,3
1484 | DB2,MDR12,3
1485 | DB2,VB1,2
1486 | DB2,VD3,23
1487 | DB2,VD4,14
1488 | DB2,VD5,1
1489 | DB3,AS4,1
1490 | DB3,AS5,1
1491 | DB3,AVBL,1
1492 | DB3,AVBR,1
1493 | DB3,DA4,1
1494 | DB3,DB2,6
1495 | DB3,DB4,1
1496 | DB3,DD2,4
1497 | DB3,DD3,10
1498 | DB3,MDL11,3
1499 | DB3,MDL12,3
1500 | DB3,MDL13,4
1501 | DB3,MDL14,3
1502 | DB3,MDR11,3
1503 | DB3,MDR12,3
1504 | DB3,MDR13,4
1505 | DB3,MDR14,3
1506 | DB3,VD4,9
1507 | DB3,VD5,26
1508 | DB3,VD6,7
1509 | DB4,AVBL,1
1510 | DB4,AVBR,1
1511 | DB4,DB1,1
1512 | DB4,DB3,1
1513 | DB4,DD3,3
1514 | DB4,MDL13,2
1515 | DB4,MDL14,2
1516 | DB4,MDL16,2
1517 | DB4,MDR13,2
1518 | DB4,MDR14,2
1519 | DB4,MDR16,2
1520 | DB4,VB2,1
1521 | DB4,VB4,1
1522 | DB4,VD6,13
1523 | DB5,AVAR,2
1524 | DB5,AVBL,1
1525 | DB5,AVBR,1
1526 | DB5,MDL15,2
1527 | DB5,MDL17,2
1528 | DB5,MDL18,2
1529 | DB5,MDR15,2
1530 | DB5,MDR17,2
1531 | DB5,MDR18,2
1532 | DB6,AVAL,3
1533 | DB6,AVBL,2
1534 | DB6,AVBR,1
1535 | DB6,MDL17,2
1536 | DB6,MDL19,2
1537 | DB6,MDL20,2
1538 | DB6,MDR17,2
1539 | DB6,MDR19,2
1540 | DB6,MDR20,2
1541 | DB7,AVBL,2
1542 | DB7,AVBR,1
1543 | DB7,MDL19,2
1544 | DB7,MDL21,2
1545 | DB7,MDL22,2
1546 | DB7,MDL23,2
1547 | DB7,MDL24,2
1548 | DB7,MDR19,2
1549 | DB7,MDR21,2
1550 | DB7,MDR22,2
1551 | DB7,MDR23,2
1552 | DB7,MDR24,2
1553 | DB7,VD13,2
1554 | DD1,AVBR,1
1555 | DD1,DA2,2
1556 | DD1,DD2,1
1557 | DD1,MDL07,-4
1558 | DD1,MDL08,-4
1559 | DD1,MDL09,-5
1560 | DD1,MDL10,-4
1561 | DD1,MDR07,-4
1562 | DD1,MDR08,-4
1563 | DD1,MDR09,-5
1564 | DD1,MDR10,-4
1565 | DD1,VD1,4
1566 | DD1,VD2,1
1567 | DD1,VD2,2
1568 | DD2,DA3,1
1569 | DD2,DD1,1
1570 | DD2,DD3,2
1571 | DD2,MDL09,-4
1572 | DD2,MDL11,-5
1573 | DD2,MDL12,-4
1574 | DD2,MDR09,-4
1575 | DD2,MDR11,-5
1576 | DD2,MDR12,-4
1577 | DD2,VD3,1
1578 | DD2,VD4,1
1579 | DD2,VD4,2
1580 | DD3,DD2,2
1581 | DD3,DD4,1
1582 | DD3,MDL11,-5
1583 | DD3,MDL13,-6
1584 | DD3,MDL14,-5
1585 | DD3,MDR11,-5
1586 | DD3,MDR13,-6
1587 | DD3,MDR14,-5
1588 | DD4,DD3,1
1589 | DD4,MDL13,-5
1590 | DD4,MDL15,-5
1591 | DD4,MDL16,-5
1592 | DD4,MDR13,-5
1593 | DD4,MDR15,-5
1594 | DD4,MDR16,-5
1595 | DD4,VC3,1
1596 | DD4,VD8,1
1597 | DD5,MDL17,-5
1598 | DD5,MDL18,-5
1599 | DD5,MDL20,-5
1600 | DD5,MDR17,-5
1601 | DD5,MDR18,-5
1602 | DD5,MDR20,-5
1603 | DD5,VB8,1
1604 | DD5,VD10,1
1605 | DD5,VD9,1
1606 | DD6,MDL19,-5
1607 | DD6,MDL21,-5
1608 | DD6,MDL22,-5
1609 | DD6,MDL23,-5
1610 | DD6,MDL24,-5
1611 | DD6,MDR19,-5
1612 | DD6,MDR21,-5
1613 | DD6,MDR22,-5
1614 | DD6,MDR23,-5
1615 | DD6,MDR24,-5
1616 | DVA,AIZL,3
1617 | DVA,AQR,4
1618 | DVA,AUAL,1
1619 | DVA,AUAR,1
1620 | DVA,AVAL,3
1621 | DVA,AVAR,1
1622 | DVA,AVBL,1
1623 | DVA,AVBL,1
1624 | DVA,AVBR,1
1625 | DVA,AVEL,9
1626 | DVA,AVER,5
1627 | DVA,DB1,1
1628 | DVA,DB2,1
1629 | DVA,DB3,2
1630 | DVA,DB4,1
1631 | DVA,DB5,1
1632 | DVA,DB6,2
1633 | DVA,DB7,1
1634 | DVA,PDEL,3
1635 | DVA,PVCL,3
1636 | DVA,PVCL,1
1637 | DVA,PVCR,1
1638 | DVA,PVR,3
1639 | DVA,PVR,2
1640 | DVA,RIAL,1
1641 | DVA,RIAR,1
1642 | DVA,RIMR,1
1643 | DVA,RIR,3
1644 | DVA,SAADR,1
1645 | DVA,SAAVL,1
1646 | DVA,SAAVR,1
1647 | DVA,SABD,1
1648 | DVA,SMBDL,3
1649 | DVA,SMBDR,2
1650 | DVA,SMBVL,3
1651 | DVA,SMBVR,2
1652 | DVA,VA12,1
1653 | DVA,VA2,1
1654 | DVA,VB1,1
1655 | DVA,VB11,2
1656 | DVB,AS9,7
1657 | DVB,AVL,5
1658 | DVB,AVL,1
1659 | DVB,DA8,2
1660 | DVB,DD6,3
1661 | DVB,DVC,3
1662 | DVB,MANAL,-5
1663 | DVB,PDA,1
1664 | DVB,PHCL,1
1665 | DVB,PVPL,1
1666 | DVB,VA9,1
1667 | DVB,VB9,1
1668 | DVC,AIBL,1
1669 | DVC,AIBL,1
1670 | DVC,AIBR,3
1671 | DVC,AIBR,2
1672 | DVC,AVAL,5
1673 | DVC,AVAR,7
1674 | DVC,AVBL,1
1675 | DVC,AVKL,2
1676 | DVC,AVKR,1
1677 | DVC,AVL,9
1678 | DVC,PVPL,2
1679 | DVC,PVPR,13
1680 | DVC,PVT,1
1681 | DVC,RIBL,1
1682 | DVC,RIBR,1
1683 | DVC,RIGL,5
1684 | DVC,RIGR,5
1685 | DVC,RMFL,2
1686 | DVC,RMFR,4
1687 | DVC,VA9,1
1688 | DVC,VD1,5
1689 | DVC,VD10,4
1690 | FLPL,ADEL,2
1691 | FLPL,ADER,2
1692 | FLPL,AIBL,1
1693 | FLPL,AIBR,2
1694 | FLPL,AVAL,14
1695 | FLPL,AVAL,1
1696 | FLPL,AVAR,17
1697 | FLPL,AVBL,4
1698 | FLPL,AVBR,5
1699 | FLPL,AVDL,6
1700 | FLPL,AVDL,1
1701 | FLPL,AVDR,13
1702 | FLPL,DVA,1
1703 | FLPL,FLPR,1
1704 | FLPL,FLPR,2
1705 | FLPL,RIH,1
1706 | FLPR,ADER,1
1707 | FLPR,AIBR,1
1708 | FLPR,AVAL,12
1709 | FLPR,AVAR,5
1710 | FLPR,AVBL,5
1711 | FLPR,AVBR,1
1712 | FLPR,AVDL,10
1713 | FLPR,AVDL,1
1714 | FLPR,AVDR,1
1715 | FLPR,AVDR,1
1716 | FLPR,AVEL,4
1717 | FLPR,AVER,2
1718 | FLPR,AVJR,1
1719 | FLPR,DVA,1
1720 | FLPR,FLPL,2
1721 | FLPR,FLPL,2
1722 | FLPR,PVCL,2
1723 | FLPR,VB1,1
1724 | HSNL,AIAL,1
1725 | HSNL,AIZL,2
1726 | HSNL,AIZR,1
1727 | HSNL,ASHL,1
1728 | HSNL,ASHR,2
1729 | HSNL,ASJR,1
1730 | HSNL,ASKL,1
1731 | HSNL,AVDR,2
1732 | HSNL,AVFL,6
1733 | HSNL,AVJL,1
1734 | HSNL,AWBL,1
1735 | HSNL,AWBR,2
1736 | HSNL,HSNR,3
1737 | HSNL,HSNR,1
1738 | HSNL,MVULVA,7
1739 | HSNL,RIFL,3
1740 | HSNL,RIML,2
1741 | HSNL,SABVL,2
1742 | HSNL,VC5,3
1743 | HSNR,AIBL,1
1744 | HSNR,AIBR,1
1745 | HSNR,AIZL,1
1746 | HSNR,AIZR,1
1747 | HSNR,AS5,1
1748 | HSNR,ASHL,2
1749 | HSNR,AVDR,1
1750 | HSNR,AVFL,1
1751 | HSNR,AVJL,1
1752 | HSNR,AVL,1
1753 | HSNR,AWBL,1
1754 | HSNR,BDUR,1
1755 | HSNR,DA5,1
1756 | HSNR,DA6,1
1757 | HSNR,HSNL,1
1758 | HSNR,HSNL,1
1759 | HSNR,MVULVA,6
1760 | HSNR,PVNR,1
1761 | HSNR,PVNR,1
1762 | HSNR,PVQR,1
1763 | HSNR,RIFR,4
1764 | HSNR,RMGR,1
1765 | HSNR,SABD,1
1766 | HSNR,SABVR,1
1767 | HSNR,VA6,1
1768 | HSNR,VC2,3
1769 | HSNR,VC3,1
1770 | HSNR,VD4,2
1771 | I1L,I1R,1
1772 | I1L,I3,1
1773 | I1L,I5,1
1774 | I1L,RIPL,1
1775 | I1L,RIPR,1
1776 | I1R,I1L,1
1777 | I1R,I3,1
1778 | I1R,I5,1
1779 | I1R,RIPL,1
1780 | I1R,RIPR,1
1781 | I2L,I1L,1
1782 | I2L,I1R,1
1783 | I2L,M1,2
1784 | I2L,M1,2
1785 | I2R,I1L,1
1786 | I2R,I1R,1
1787 | I2R,M1,2
1788 | I2R,M1,2
1789 | I3,M1,2
1790 | I3,M1,2
1791 | I3,M2L,1
1792 | I3,M2L,1
1793 | I3,M2R,1
1794 | I3,M2R,1
1795 | I4,I2L,5
1796 | I4,I2R,5
1797 | I4,I5,2
1798 | I4,M1,2
1799 | I4,M1,2
1800 | I5,I1L,3
1801 | I5,I1L,1
1802 | I5,I1R,2
1803 | I5,I1R,1
1804 | I5,M1,1
1805 | I5,M1,1
1806 | I5,M5,1
1807 | I5,M5,1
1808 | I5,MI,2
1809 | I5,MI,2
1810 | I6,I2L,2
1811 | I6,I2R,2
1812 | I6,I3,1
1813 | I6,M4,1
1814 | I6,M5,2
1815 | I6,NSML,2
1816 | I6,NSMR,2
1817 | IL1DL,IL1DR,1
1818 | IL1DL,IL1L,1
1819 | IL1DL,MDL01,1
1820 | IL1DL,MDL02,1
1821 | IL1DL,MDL04,2
1822 | IL1DL,OLLL,1
1823 | IL1DL,PVR,1
1824 | IL1DL,RIH,1
1825 | IL1DL,RIPL,2
1826 | IL1DL,RMDDR,1
1827 | IL1DL,RMDVL,4
1828 | IL1DL,RMEV,1
1829 | IL1DL,URYDL,1
1830 | IL1DR,IL1DL,1
1831 | IL1DR,IL1R,1
1832 | IL1DR,MDR01,4
1833 | IL1DR,MDR02,3
1834 | IL1DR,OLLR,1
1835 | IL1DR,RIPR,5
1836 | IL1DR,RMDVR,5
1837 | IL1DR,RMEV,1
1838 | IL1L,AVER,2
1839 | IL1L,IL1DL,1
1840 | IL1L,IL1DL,1
1841 | IL1L,IL1VL,1
1842 | IL1L,MDL01,3
1843 | IL1L,MDL03,3
1844 | IL1L,MDL05,4
1845 | IL1L,MVL01,3
1846 | IL1L,MVL03,3
1847 | IL1L,RMDDL,5
1848 | IL1L,RMDL,1
1849 | IL1L,RMDR,3
1850 | IL1L,RMDVL,4
1851 | IL1L,RMDVR,2
1852 | IL1L,RMER,1
1853 | IL1R,AVEL,1
1854 | IL1R,AVER,1
1855 | IL1R,IL1DR,1
1856 | IL1R,IL1DR,1
1857 | IL1R,IL1VR,1
1858 | IL1R,MDR01,3
1859 | IL1R,MDR03,3
1860 | IL1R,MVR01,3
1861 | IL1R,MVR03,3
1862 | IL1R,RMDDL,3
1863 | IL1R,RMDDR,2
1864 | IL1R,RMDL,4
1865 | IL1R,RMDR,2
1866 | IL1R,RMDVL,1
1867 | IL1R,RMDVR,4
1868 | IL1R,RMEL,2
1869 | IL1R,RMHL,1
1870 | IL1R,URXR,2
1871 | IL1VL,IL1L,1
1872 | IL1VL,IL1L,1
1873 | IL1VL,IL1VR,1
1874 | IL1VL,MVL01,5
1875 | IL1VL,MVL02,4
1876 | IL1VL,RIPL,4
1877 | IL1VL,RMDDL,5
1878 | IL1VL,RMED,1
1879 | IL1VL,URYVL,1
1880 | IL1VR,IL1R,1
1881 | IL1VR,IL1R,1
1882 | IL1VR,IL1VL,1
1883 | IL1VR,IL2R,1
1884 | IL1VR,IL2VR,1
1885 | IL1VR,MVR01,5
1886 | IL1VR,MVR02,5
1887 | IL1VR,RIPR,6
1888 | IL1VR,RMDDR,10
1889 | IL1VR,RMER,1
1890 | IL2DL,AUAL,1
1891 | IL2DL,IL1DL,7
1892 | IL2DL,OLQDL,2
1893 | IL2DL,RIBL,1
1894 | IL2DL,RIPL,10
1895 | IL2DL,RMEL,4
1896 | IL2DL,RMER,3
1897 | IL2DL,URADL,3
1898 | IL2DR,CEPDR,1
1899 | IL2DR,IL1DR,7
1900 | IL2DR,RICR,1
1901 | IL2DR,RIPR,11
1902 | IL2DR,RMED,1
1903 | IL2DR,RMEL,2
1904 | IL2DR,RMER,2
1905 | IL2DR,RMEV,1
1906 | IL2DR,URADR,3
1907 | IL2L,ADEL,2
1908 | IL2L,AVEL,1
1909 | IL2L,IL1L,1
1910 | IL2L,OLQDL,5
1911 | IL2L,OLQVL,8
1912 | IL2L,RICL,1
1913 | IL2L,RIH,7
1914 | IL2L,RMDL,3
1915 | IL2L,RMDR,1
1916 | IL2L,RMER,2
1917 | IL2L,RMEV,2
1918 | IL2L,RMGL,1
1919 | IL2L,URXL,2
1920 | IL2R,ADER,1
1921 | IL2R,IL1R,1
1922 | IL2R,IL1VR,1
1923 | IL2R,OLLR,1
1924 | IL2R,OLQDR,2
1925 | IL2R,OLQVR,7
1926 | IL2R,RIH,6
1927 | IL2R,RMDL,1
1928 | IL2R,RMEL,2
1929 | IL2R,RMEV,1
1930 | IL2R,RMGR,1
1931 | IL2R,URBR,1
1932 | IL2R,URXR,1
1933 | IL2VL,BAGR,1
1934 | IL2VL,IL1VL,7
1935 | IL2VL,IL2L,1
1936 | IL2VL,OLQVL,1
1937 | IL2VL,RIAL,1
1938 | IL2VL,RIH,2
1939 | IL2VL,RIPL,11
1940 | IL2VL,RMEL,1
1941 | IL2VL,RMER,4
1942 | IL2VL,RMEV,1
1943 | IL2VL,URAVL,3
1944 | IL2VR,IL1VR,6
1945 | IL2VR,OLQVR,1
1946 | IL2VR,RIAR,2
1947 | IL2VR,RIH,3
1948 | IL2VR,RIPR,15
1949 | IL2VR,RMEL,3
1950 | IL2VR,RMER,2
1951 | IL2VR,RMEV,3
1952 | IL2VR,URAVR,4
1953 | IL2VR,URXR,1
1954 | LUAL,AVAL,5
1955 | LUAL,AVAL,1
1956 | LUAL,AVAR,6
1957 | LUAL,AVDL,4
1958 | LUAL,AVDR,2
1959 | LUAL,AVJL,1
1960 | LUAL,PHBL,1
1961 | LUAL,PLML,1
1962 | LUAL,PVNL,1
1963 | LUAL,PVR,1
1964 | LUAL,PVWL,1
1965 | LUAR,AVAL,3
1966 | LUAR,AVAR,7
1967 | LUAR,AVDL,1
1968 | LUAR,AVDR,3
1969 | LUAR,AVJR,1
1970 | LUAR,PLMR,1
1971 | LUAR,PQR,1
1972 | LUAR,PVCR,3
1973 | LUAR,PVR,1
1974 | LUAR,PVR,1
1975 | LUAR,PVWL,1
1976 | M1,I2L,2
1977 | M1,I2R,2
1978 | M1,I3,1
1979 | M1,I4,1
1980 | M2L,I1L,3
1981 | M2L,I1R,3
1982 | M2L,I3,2
1983 | M2L,I3,1
1984 | M2L,M2R,1
1985 | M2L,M5,1
1986 | M2L,MI,2
1987 | M2L,MI,2
1988 | M2R,I1L,3
1989 | M2R,I1R,3
1990 | M2R,I3,2
1991 | M2R,I3,1
1992 | M2R,M3L,1
1993 | M2R,M3R,1
1994 | M2R,M5,1
1995 | M2R,MI,2
1996 | M2R,MI,2
1997 | M3L,I1L,4
1998 | M3L,I1R,4
1999 | M3L,I4,2
2000 | M3L,I5,3
2001 | M3L,I6,1
2002 | M3L,M1,1
2003 | M3L,M1,1
2004 | M3L,M3R,1
2005 | M3L,MCL,1
2006 | M3L,MCR,1
2007 | M3L,MI,1
2008 | M3L,MI,1
2009 | M3L,NSML,2
2010 | M3L,NSMR,3
2011 | M3R,I1L,4
2012 | M3R,I1R,4
2013 | M3R,I3,2
2014 | M3R,I4,6
2015 | M3R,I5,3
2016 | M3R,I6,1
2017 | M3R,M1,1
2018 | M3R,M1,1
2019 | M3R,M3L,1
2020 | M3R,MCL,1
2021 | M3R,MCR,1
2022 | M3R,MI,1
2023 | M3R,MI,1
2024 | M3R,NSML,2
2025 | M3R,NSMR,3
2026 | M4,I3,1
2027 | M4,I5,13
2028 | M4,I6,2
2029 | M4,I6,1
2030 | M4,M2L,1
2031 | M4,M2R,1
2032 | M4,M4,6
2033 | M4,M5,1
2034 | M4,NSML,1
2035 | M4,NSMR,1
2036 | M5,I5,3
2037 | M5,I5,1
2038 | M5,I6,1
2039 | M5,M1,1
2040 | M5,M1,1
2041 | M5,M2L,2
2042 | M5,M2R,2
2043 | M5,M5,4
2044 | MCL,I1L,3
2045 | MCL,I1R,3
2046 | MCL,I2L,1
2047 | MCL,I2R,1
2048 | MCL,I3,1
2049 | MCL,M1,1
2050 | MCL,M1,1
2051 | MCL,M2L,2
2052 | MCL,M2R,2
2053 | MCR,I1L,3
2054 | MCR,I1R,3
2055 | MCR,I3,1
2056 | MCR,M1,1
2057 | MCR,M1,1
2058 | MCR,M2L,2
2059 | MCR,M2R,2
2060 | MI,I1L,1
2061 | MI,I1R,1
2062 | MI,I3,1
2063 | MI,I4,1
2064 | MI,I5,2
2065 | MI,M1,1
2066 | MI,M2L,2
2067 | MI,M2R,2
2068 | MI,M3L,1
2069 | MI,M3R,1
2070 | MI,MCL,2
2071 | MI,MCR,2
2072 | NSML,I1L,1
2073 | NSML,I1R,2
2074 | NSML,I2L,6
2075 | NSML,I2R,6
2076 | NSML,I3,2
2077 | NSML,I4,3
2078 | NSML,I5,2
2079 | NSML,I6,2
2080 | NSML,M3L,1
2081 | NSML,M3L,1
2082 | NSML,M3R,1
2083 | NSML,M3R,1
2084 | NSMR,I1L,2
2085 | NSMR,I1R,2
2086 | NSMR,I2L,6
2087 | NSMR,I2R,6
2088 | NSMR,I3,2
2089 | NSMR,I4,3
2090 | NSMR,I5,2
2091 | NSMR,I6,2
2092 | NSMR,M3L,1
2093 | NSMR,M3L,1
2094 | NSMR,M3R,1
2095 | NSMR,M3R,1
2096 | OLLL,AVER,21
2097 | OLLL,CEPDL,3
2098 | OLLL,CEPVL,4
2099 | OLLL,IL1DL,1
2100 | OLLL,IL1VL,2
2101 | OLLL,OLLR,2
2102 | OLLL,RIBL,8
2103 | OLLL,RIGL,1
2104 | OLLL,RMDDL,7
2105 | OLLL,RMDL,2
2106 | OLLL,RMDVL,1
2107 | OLLL,RMEL,2
2108 | OLLL,SMDDL,3
2109 | OLLL,SMDDR,4
2110 | OLLL,SMDVR,4
2111 | OLLL,URYDL,1
2112 | OLLR,AVEL,16
2113 | OLLR,CEPDR,1
2114 | OLLR,CEPVR,6
2115 | OLLR,IL1DR,2
2116 | OLLR,IL1DR,1
2117 | OLLR,IL1VR,1
2118 | OLLR,IL2R,1
2119 | OLLR,OLLL,2
2120 | OLLR,RIBR,10
2121 | OLLR,RIGR,1
2122 | OLLR,RMDDR,10
2123 | OLLR,RMDL,3
2124 | OLLR,RMDVR,3
2125 | OLLR,RMER,2
2126 | OLLR,SMDDR,1
2127 | OLLR,SMDVL,4
2128 | OLLR,SMDVR,3
2129 | OLQDL,CEPDL,1
2130 | OLQDL,RIBL,2
2131 | OLQDL,RICR,1
2132 | OLQDL,RIGL,1
2133 | OLQDL,RMDDR,4
2134 | OLQDL,RMDVL,1
2135 | OLQDL,SIBVL,3
2136 | OLQDL,URBL,1
2137 | OLQDR,CEPDR,2
2138 | OLQDR,RIBR,2
2139 | OLQDR,RICL,1
2140 | OLQDR,RICR,1
2141 | OLQDR,RIGR,1
2142 | OLQDR,RIH,1
2143 | OLQDR,RMDDL,3
2144 | OLQDR,RMDVR,1
2145 | OLQDR,RMHR,1
2146 | OLQDR,SIBVR,2
2147 | OLQDR,URBR,1
2148 | OLQVL,ADLL,1
2149 | OLQVL,CEPVL,1
2150 | OLQVL,IL1VL,1
2151 | OLQVL,IL2VL,1
2152 | OLQVL,RIBL,1
2153 | OLQVL,RICL,1
2154 | OLQVL,RIGL,1
2155 | OLQVL,RIH,1
2156 | OLQVL,RIPL,1
2157 | OLQVL,RMDDL,1
2158 | OLQVL,RMDVR,4
2159 | OLQVL,SIBDL,3
2160 | OLQVL,URBL,1
2161 | OLQVR,CEPVR,1
2162 | OLQVR,IL1VR,1
2163 | OLQVR,RIBR,1
2164 | OLQVR,RICR,1
2165 | OLQVR,RIGR,1
2166 | OLQVR,RIH,2
2167 | OLQVR,RIPR,2
2168 | OLQVR,RMDDR,1
2169 | OLQVR,RMDVL,4
2170 | OLQVR,RMER,1
2171 | OLQVR,SIBDR,4
2172 | OLQVR,URBR,1
2173 | PDA,AS11,1
2174 | PDA,DA9,1
2175 | PDA,DA9,1
2176 | PDA,DD6,1
2177 | PDA,MDL21,2
2178 | PDA,PVNR,1
2179 | PDA,VD13,3
2180 | PDB,AS11,2
2181 | PDB,MVL22,1
2182 | PDB,MVR21,1
2183 | PDB,RID,2
2184 | PDB,VD13,2
2185 | PDEL,AVKL,6
2186 | PDEL,DVA,24
2187 | PDEL,PDER,1
2188 | PDEL,PDER,3
2189 | PDEL,PVCR,1
2190 | PDEL,PVM,2
2191 | PDEL,PVM,1
2192 | PDEL,PVR,2
2193 | PDEL,VA9,1
2194 | PDEL,VD11,1
2195 | PDER,AVKL,16
2196 | PDER,DVA,35
2197 | PDER,PDEL,3
2198 | PDER,PVCL,1
2199 | PDER,PVCR,1
2200 | PDER,PVM,1
2201 | PDER,VA8,1
2202 | PDER,VD9,1
2203 | PHAL,AVDR,1
2204 | PHAL,AVFL,3
2205 | PHAL,AVG,5
2206 | PHAL,AVHL,1
2207 | PHAL,AVHR,1
2208 | PHAL,DVA,2
2209 | PHAL,PHAR,5
2210 | PHAL,PHAR,2
2211 | PHAL,PHBL,5
2212 | PHAL,PHBR,5
2213 | PHAL,PVQL,2
2214 | PHAR,AVG,3
2215 | PHAR,AVHR,1
2216 | PHAR,DA8,1
2217 | PHAR,DVA,1
2218 | PHAR,PHAL,6
2219 | PHAR,PHAL,2
2220 | PHAR,PHBL,1
2221 | PHAR,PHBR,5
2222 | PHAR,PVPL,3
2223 | PHAR,PVQL,2
2224 | PHBL,AVAL,9
2225 | PHBL,AVAR,6
2226 | PHBL,AVDL,1
2227 | PHBL,PHBR,1
2228 | PHBL,PHBR,3
2229 | PHBL,PVCL,13
2230 | PHBL,VA12,1
2231 | PHBR,AVAL,7
2232 | PHBR,AVAR,7
2233 | PHBR,AVDL,1
2234 | PHBR,AVDR,1
2235 | PHBR,AVFL,1
2236 | PHBR,AVHL,1
2237 | PHBR,DA8,1
2238 | PHBR,PHBL,1
2239 | PHBR,PHBL,3
2240 | PHBR,PVCL,6
2241 | PHBR,PVCR,3
2242 | PHBR,VA12,2
2243 | PHCL,AVAL,1
2244 | PHCL,DA9,7
2245 | PHCL,DA9,1
2246 | PHCL,DVA,6
2247 | PHCL,LUAL,1
2248 | PHCL,PHCR,1
2249 | PHCL,PLML,1
2250 | PHCL,PVCL,2
2251 | PHCL,VA12,2
2252 | PHCL,VA12,1
2253 | PHCR,AVHR,1
2254 | PHCR,DA9,2
2255 | PHCR,DVA,8
2256 | PHCR,LUAR,1
2257 | PHCR,PHCL,1
2258 | PHCR,PHCL,1
2259 | PHCR,PVCR,8
2260 | PHCR,PVCR,1
2261 | PHCR,VA12,1
2262 | PHCR,VA12,1
2263 | PLML,HSNL,1
2264 | PLML,LUAL,1
2265 | PLML,PHCL,1
2266 | PLML,PVCL,1
2267 | PLMR,AS6,1
2268 | PLMR,AVAL,4
2269 | PLMR,AVAR,1
2270 | PLMR,AVDL,1
2271 | PLMR,AVDR,4
2272 | PLMR,DVA,5
2273 | PLMR,HSNR,1
2274 | PLMR,LUAR,1
2275 | PLMR,PDEL,2
2276 | PLMR,PDER,3
2277 | PLMR,PVCL,2
2278 | PLMR,PVCR,1
2279 | PLMR,PVR,2
2280 | PLNL,SAADL,5
2281 | PLNL,SMBVL,6
2282 | PLNR,SAADR,4
2283 | PLNR,SMBVR,6
2284 | PQR,AVAL,8
2285 | PQR,AVAR,11
2286 | PQR,AVDL,7
2287 | PQR,AVDR,6
2288 | PQR,AVG,1
2289 | PQR,LUAR,1
2290 | PQR,PVNL,1
2291 | PQR,PVPL,4
2292 | PVCL,AS1,1
2293 | PVCL,AVAL,1
2294 | PVCL,AVAL,2
2295 | PVCL,AVAR,4
2296 | PVCL,AVBL,5
2297 | PVCL,AVBR,12
2298 | PVCL,AVDL,5
2299 | PVCL,AVDR,2
2300 | PVCL,AVEL,2
2301 | PVCL,AVER,1
2302 | PVCL,AVJL,3
2303 | PVCL,AVJL,1
2304 | PVCL,AVJR,1
2305 | PVCL,AVJR,1
2306 | PVCL,DA2,1
2307 | PVCL,DA5,1
2308 | PVCL,DA6,1
2309 | PVCL,DB2,3
2310 | PVCL,DB3,4
2311 | PVCL,DB4,3
2312 | PVCL,DB5,2
2313 | PVCL,DB6,2
2314 | PVCL,DB7,3
2315 | PVCL,DVA,4
2316 | PVCL,DVA,1
2317 | PVCL,PLML,1
2318 | PVCL,PVCR,2
2319 | PVCL,PVCR,5
2320 | PVCL,RID,5
2321 | PVCL,RIS,2
2322 | PVCL,SIBVL,2
2323 | PVCL,VB10,2
2324 | PVCL,VB10,1
2325 | PVCL,VB11,1
2326 | PVCL,VB3,1
2327 | PVCL,VB4,1
2328 | PVCL,VB5,1
2329 | PVCL,VB6,2
2330 | PVCL,VB8,1
2331 | PVCL,VB9,2
2332 | PVCR,AQR,1
2333 | PVCR,AS2,1
2334 | PVCR,AVAL,7
2335 | PVCR,AVAL,5
2336 | PVCR,AVAR,7
2337 | PVCR,AVAR,3
2338 | PVCR,AVBL,8
2339 | PVCR,AVBR,6
2340 | PVCR,AVDL,5
2341 | PVCR,AVDR,1
2342 | PVCR,AVEL,1
2343 | PVCR,AVER,1
2344 | PVCR,AVJL,3
2345 | PVCR,AVL,1
2346 | PVCR,DA9,1
2347 | PVCR,DB2,1
2348 | PVCR,DB3,3
2349 | PVCR,DB4,4
2350 | PVCR,DB5,1
2351 | PVCR,DB6,2
2352 | PVCR,DB7,1
2353 | PVCR,FLPL,1
2354 | PVCR,LUAR,1
2355 | PVCR,PDEL,1
2356 | PVCR,PDEL,1
2357 | PVCR,PHCR,1
2358 | PVCR,PLMR,1
2359 | PVCR,PVCL,3
2360 | PVCR,PVCL,5
2361 | PVCR,PVDL,1
2362 | PVCR,PVR,1
2363 | PVCR,PVWL,2
2364 | PVCR,PVWR,1
2365 | PVCR,PVWR,1
2366 | PVCR,RID,5
2367 | PVCR,SIBVR,2
2368 | PVCR,VA8,2
2369 | PVCR,VA9,1
2370 | PVCR,VB10,1
2371 | PVCR,VB4,3
2372 | PVCR,VB6,2
2373 | PVCR,VB7,3
2374 | PVCR,VB8,1
2375 | PVDL,AVAL,6
2376 | PVDL,AVAR,6
2377 | PVDL,DD5,1
2378 | PVDL,PVCL,1
2379 | PVDL,PVCR,6
2380 | PVDL,VD10,1
2381 | PVDR,AVAL,6
2382 | PVDR,AVAR,9
2383 | PVDR,DVA,3
2384 | PVDR,PVCL,13
2385 | PVDR,PVCR,10
2386 | PVDR,PVDL,1
2387 | PVDR,VA9,1
2388 | PVM,AVKL,11
2389 | PVM,AVL,1
2390 | PVM,AVM,1
2391 | PVM,DVA,3
2392 | PVM,PDEL,7
2393 | PVM,PDEL,1
2394 | PVM,PDER,8
2395 | PVM,PDER,1
2396 | PVM,PVCL,2
2397 | PVM,PVR,1
2398 | PVNL,AVAL,2
2399 | PVNL,AVBR,1
2400 | PVNL,AVBR,2
2401 | PVNL,AVDL,3
2402 | PVNL,AVDR,3
2403 | PVNL,AVEL,1
2404 | PVNL,AVFR,1
2405 | PVNL,AVG,1
2406 | PVNL,AVJL,5
2407 | PVNL,AVJR,5
2408 | PVNL,AVL,2
2409 | PVNL,BDUL,1
2410 | PVNL,BDUR,2
2411 | PVNL,DD1,2
2412 | PVNL,MVL09,3
2413 | PVNL,PQR,1
2414 | PVNL,PVCL,1
2415 | PVNL,PVNR,5
2416 | PVNL,PVQR,1
2417 | PVNL,PVT,1
2418 | PVNL,PVWL,1
2419 | PVNL,RIFL,1
2420 | PVNR,AVAL,2
2421 | PVNR,AVBL,1
2422 | PVNR,AVBR,2
2423 | PVNR,AVDR,1
2424 | PVNR,AVEL,3
2425 | PVNR,AVJL,4
2426 | PVNR,AVJR,1
2427 | PVNR,AVL,2
2428 | PVNR,BDUL,1
2429 | PVNR,BDUR,2
2430 | PVNR,DD3,1
2431 | PVNR,HSNR,1
2432 | PVNR,HSNR,1
2433 | PVNR,MVL12,1
2434 | PVNR,MVL13,2
2435 | PVNR,PQR,2
2436 | PVNR,PVCL,1
2437 | PVNR,PVNL,1
2438 | PVNR,PVT,2
2439 | PVNR,PVWL,2
2440 | PVNR,VC2,1
2441 | PVNR,VC3,1
2442 | PVNR,VD12,1
2443 | PVNR,VD6,1
2444 | PVNR,VD7,1
2445 | PVPL,ADAL,1
2446 | PVPL,AQR,1
2447 | PVPL,AQR,7
2448 | PVPL,AVAL,1
2449 | PVPL,AVAL,1
2450 | PVPL,AVAR,1
2451 | PVPL,AVBL,5
2452 | PVPL,AVBR,6
2453 | PVPL,AVDR,2
2454 | PVPL,AVER,1
2455 | PVPL,AVHR,1
2456 | PVPL,AVKL,1
2457 | PVPL,AVKR,6
2458 | PVPL,DVC,2
2459 | PVPL,PHAR,3
2460 | PVPL,PQR,4
2461 | PVPL,PVCR,3
2462 | PVPL,PVPR,1
2463 | PVPL,PVT,1
2464 | PVPL,RIGL,2
2465 | PVPL,VD13,2
2466 | PVPL,VD3,1
2467 | PVPR,ADFR,1
2468 | PVPR,AQR,2
2469 | PVPR,AQR,9
2470 | PVPR,ASHR,1
2471 | PVPR,AVAL,1
2472 | PVPR,AVAR,2
2473 | PVPR,AVBL,4
2474 | PVPR,AVBR,5
2475 | PVPR,AVHL,3
2476 | PVPR,AVKL,1
2477 | PVPR,AVL,4
2478 | PVPR,DD2,1
2479 | PVPR,DVC,1
2480 | PVPR,DVC,13
2481 | PVPR,PVCL,4
2482 | PVPR,PVCR,7
2483 | PVPR,PVPL,1
2484 | PVPR,PVQR,1
2485 | PVPR,RIAR,2
2486 | PVPR,RIGR,1
2487 | PVPR,RIMR,1
2488 | PVPR,RMGR,1
2489 | PVPR,VD4,1
2490 | PVPR,VD5,1
2491 | PVQL,ADAL,1
2492 | PVQL,AIAL,3
2493 | PVQL,ASJL,1
2494 | PVQL,ASKL,4
2495 | PVQL,ASKL,5
2496 | PVQL,HSNL,2
2497 | PVQL,PVQR,2
2498 | PVQL,RMGL,1
2499 | PVQR,ADAR,1
2500 | PVQR,AIAR,7
2501 | PVQR,ASER,1
2502 | PVQR,ASKR,4
2503 | PVQR,ASKR,4
2504 | PVQR,AVBL,1
2505 | PVQR,AVFL,1
2506 | PVQR,AVFR,1
2507 | PVQR,AVL,1
2508 | PVQR,AWAR,2
2509 | PVQR,DD1,1
2510 | PVQR,DVC,1
2511 | PVQR,HSNR,1
2512 | PVQR,PVNL,1
2513 | PVQR,PVQL,2
2514 | PVQR,PVT,1
2515 | PVQR,RIFR,1
2516 | PVQR,VD1,1
2517 | PVR,ADAL,1
2518 | PVR,ALML,1
2519 | PVR,AS6,1
2520 | PVR,AVBL,4
2521 | PVR,AVBR,4
2522 | PVR,AVJL,3
2523 | PVR,AVJR,2
2524 | PVR,AVKL,1
2525 | PVR,DA9,1
2526 | PVR,DB2,1
2527 | PVR,DB3,1
2528 | PVR,DVA,1
2529 | PVR,DVA,2
2530 | PVR,IL1DL,1
2531 | PVR,IL1DR,1
2532 | PVR,IL1VL,1
2533 | PVR,IL1VR,1
2534 | PVR,LUAL,1
2535 | PVR,LUAR,1
2536 | PVR,PDEL,1
2537 | PVR,PDER,1
2538 | PVR,PLMR,2
2539 | PVR,PVCR,1
2540 | PVR,RIPL,3
2541 | PVR,RIPR,3
2542 | PVR,SABD,1
2543 | PVR,URADL,1
2544 | PVT,AIBL,2
2545 | PVT,AIBL,1
2546 | PVT,AIBR,4
2547 | PVT,AIBR,1
2548 | PVT,AVKL,7
2549 | PVT,AVKL,2
2550 | PVT,AVKR,7
2551 | PVT,AVL,2
2552 | PVT,DVC,2
2553 | PVT,PVPL,1
2554 | PVT,RIBL,1
2555 | PVT,RIBR,1
2556 | PVT,RIGL,2
2557 | PVT,RIGR,3
2558 | PVT,RIH,1
2559 | PVT,RMEV,1
2560 | PVT,RMFL,2
2561 | PVT,RMFR,3
2562 | PVT,SMBDR,1
2563 | PVWL,AVJL,1
2564 | PVWL,PVCR,2
2565 | PVWL,PVT,2
2566 | PVWL,PVWR,1
2567 | PVWL,VA12,1
2568 | PVWR,AVAR,1
2569 | PVWR,AVDR,1
2570 | PVWR,PVCR,1
2571 | PVWR,PVCR,1
2572 | PVWR,PVT,1
2573 | PVWR,VA12,1
2574 | RIAL,CEPVL,1
2575 | RIAL,RIAR,1
2576 | RIAL,RIVL,2
2577 | RIAL,RIVR,4
2578 | RIAL,RMDDL,12
2579 | RIAL,RMDDR,7
2580 | RIAL,RMDL,6
2581 | RIAL,RMDR,6
2582 | RIAL,RMDVL,9
2583 | RIAL,RMDVR,11
2584 | RIAL,SIADL,2
2585 | RIAL,SMDDL,8
2586 | RIAL,SMDDR,10
2587 | RIAL,SMDVL,6
2588 | RIAL,SMDVR,11
2589 | RIAR,CEPVR,1
2590 | RIAR,IL1R,1
2591 | RIAR,RIAL,4
2592 | RIAR,RIVL,1
2593 | RIAR,RMDDL,10
2594 | RIAR,RMDDR,11
2595 | RIAR,RMDL,3
2596 | RIAR,RMDR,8
2597 | RIAR,RMDVL,12
2598 | RIAR,RMDVR,10
2599 | RIAR,SAADR,1
2600 | RIAR,SIADL,1
2601 | RIAR,SIADR,1
2602 | RIAR,SIAVL,1
2603 | RIAR,SMDDL,7
2604 | RIAR,SMDDR,7
2605 | RIAR,SMDVL,13
2606 | RIAR,SMDVR,7
2607 | RIBL,AIBR,2
2608 | RIBL,AUAL,1
2609 | RIBL,AVAL,1
2610 | RIBL,AVBL,1
2611 | RIBL,AVBR,1
2612 | RIBL,AVBR,1
2613 | RIBL,AVDR,1
2614 | RIBL,AVEL,1
2615 | RIBL,AVER,5
2616 | RIBL,BAGR,1
2617 | RIBL,OLQDL,2
2618 | RIBL,OLQVL,1
2619 | RIBL,PVT,1
2620 | RIBL,RIAL,3
2621 | RIBL,RIBL,1
2622 | RIBL,RIBR,3
2623 | RIBL,RIGL,1
2624 | RIBL,SIADL,1
2625 | RIBL,SIAVL,1
2626 | RIBL,SIBDL,1
2627 | RIBL,SIBVL,1
2628 | RIBL,SIBVR,1
2629 | RIBL,SMBDL,1
2630 | RIBL,SMDDL,1
2631 | RIBL,SMDVR,2
2632 | RIBL,SMDVR,2
2633 | RIBR,AIBL,1
2634 | RIBR,AIZR,1
2635 | RIBR,AVAR,2
2636 | RIBR,AVBL,1
2637 | RIBR,AVBR,1
2638 | RIBR,AVEL,3
2639 | RIBR,AVER,1
2640 | RIBR,BAGL,1
2641 | RIBR,OLQDR,2
2642 | RIBR,OLQVR,1
2643 | RIBR,PVT,1
2644 | RIBR,RIAR,2
2645 | RIBR,RIBL,3
2646 | RIBR,RIBR,1
2647 | RIBR,RIGR,1
2648 | RIBR,RIGR,1
2649 | RIBR,RIH,1
2650 | RIBR,SIADR,1
2651 | RIBR,SIAVR,1
2652 | RIBR,SIBDR,1
2653 | RIBR,SIBVR,1
2654 | RIBR,SMBDR,1
2655 | RIBR,SMDDL,1
2656 | RIBR,SMDDL,1
2657 | RIBR,SMDDR,1
2658 | RIBR,SMDVL,2
2659 | RICL,ADAR,1
2660 | RICL,ASHL,2
2661 | RICL,AVAL,5
2662 | RICL,AVAR,6
2663 | RICL,AVKL,1
2664 | RICL,AVKR,1
2665 | RICL,AVKR,1
2666 | RICL,AWBR,1
2667 | RICL,RIML,1
2668 | RICL,RIMR,3
2669 | RICL,RIVR,1
2670 | RICL,RMFR,1
2671 | RICL,SMBDL,2
2672 | RICL,SMDDL,3
2673 | RICL,SMDDR,3
2674 | RICL,SMDVR,1
2675 | RICR,ADAR,1
2676 | RICR,ASHR,2
2677 | RICR,AVAL,5
2678 | RICR,AVAR,5
2679 | RICR,AVKL,1
2680 | RICR,SMBDR,1
2681 | RICR,SMDDL,4
2682 | RICR,SMDDR,3
2683 | RICR,SMDVL,2
2684 | RICR,SMDVR,1
2685 | RID,ALA,1
2686 | RID,AS2,1
2687 | RID,AVBL,1
2688 | RID,AVBR,2
2689 | RID,DA6,3
2690 | RID,DA9,1
2691 | RID,DB1,1
2692 | RID,DD1,4
2693 | RID,DD2,4
2694 | RID,DD3,3
2695 | RID,MDL14,-1
2696 | RID,MDL21,-2
2697 | RID,PDB,2
2698 | RID,VD13,1
2699 | RID,VD5,1
2700 | RIFL,ALML,2
2701 | RIFL,AVBL,10
2702 | RIFL,AVBR,1
2703 | RIFL,AVG,1
2704 | RIFL,AVHR,1
2705 | RIFL,AVJR,2
2706 | RIFL,PVPL,3
2707 | RIFL,RIML,4
2708 | RIFL,VD1,1
2709 | RIFR,ASHR,2
2710 | RIFR,AVBL,1
2711 | RIFR,AVBR,17
2712 | RIFR,AVFL,1
2713 | RIFR,AVG,1
2714 | RIFR,AVHL,1
2715 | RIFR,AVJL,1
2716 | RIFR,AVJR,2
2717 | RIFR,HSNR,1
2718 | RIFR,PVCL,1
2719 | RIFR,PVCR,1
2720 | RIFR,PVPR,4
2721 | RIFR,RIMR,4
2722 | RIFR,RIPR,1
2723 | RIGL,AIBR,3
2724 | RIGL,AIZR,1
2725 | RIGL,ALNL,1
2726 | RIGL,AQR,2
2727 | RIGL,AVEL,1
2728 | RIGL,AVER,1
2729 | RIGL,AVKL,1
2730 | RIGL,AVKR,2
2731 | RIGL,BAGR,1
2732 | RIGL,BAGR,1
2733 | RIGL,DVC,1
2734 | RIGL,OLLL,1
2735 | RIGL,OLQDL,1
2736 | RIGL,OLQVL,1
2737 | RIGL,RIBL,1
2738 | RIGL,RIBL,1
2739 | RIGL,RIGR,3
2740 | RIGL,RIR,2
2741 | RIGL,RMEL,1
2742 | RIGL,RMFL,1
2743 | RIGL,RMHR,3
2744 | RIGL,URYDL,1
2745 | RIGL,URYVL,1
2746 | RIGL,VB2,1
2747 | RIGL,VD1,2
2748 | RIGR,AIBL,3
2749 | RIGR,ALNR,1
2750 | RIGR,AQR,1
2751 | RIGR,AVER,2
2752 | RIGR,AVKL,4
2753 | RIGR,AVKR,1
2754 | RIGR,AVKR,1
2755 | RIGR,BAGL,1
2756 | RIGR,OLLR,1
2757 | RIGR,OLQDR,1
2758 | RIGR,OLQVR,1
2759 | RIGR,RIBR,1
2760 | RIGR,RIBR,1
2761 | RIGR,RIGL,3
2762 | RIGR,RIR,1
2763 | RIGR,RMHL,4
2764 | RIGR,URYDR,1
2765 | RIGR,URYVR,1
2766 | RIH,ADFR,1
2767 | RIH,AIZL,4
2768 | RIH,AIZR,4
2769 | RIH,AUAR,1
2770 | RIH,BAGR,1
2771 | RIH,CEPDL,1
2772 | RIH,CEPDL,1
2773 | RIH,CEPDR,1
2774 | RIH,CEPDR,1
2775 | RIH,CEPVL,1
2776 | RIH,CEPVL,1
2777 | RIH,CEPVR,1
2778 | RIH,CEPVR,1
2779 | RIH,FLPL,1
2780 | RIH,IL2L,2
2781 | RIH,IL2R,1
2782 | RIH,OLQDL,4
2783 | RIH,OLQDR,2
2784 | RIH,OLQDR,1
2785 | RIH,OLQVL,1
2786 | RIH,OLQVR,6
2787 | RIH,RIAL,10
2788 | RIH,RIAR,8
2789 | RIH,RIBL,5
2790 | RIH,RIBR,4
2791 | RIH,RIPL,4
2792 | RIH,RIPR,6
2793 | RIH,RMER,2
2794 | RIH,RMEV,1
2795 | RIH,URYVR,1
2796 | RIML,AIBR,1
2797 | RIML,AIYL,1
2798 | RIML,AVAL,1
2799 | RIML,AVAR,2
2800 | RIML,AVBL,2
2801 | RIML,AVBR,3
2802 | RIML,AVEL,2
2803 | RIML,AVER,3
2804 | RIML,MDR05,2
2805 | RIML,MVR05,2
2806 | RIML,RIBL,1
2807 | RIML,RIS,1
2808 | RIML,RMDL,1
2809 | RIML,RMDR,1
2810 | RIML,RMFR,1
2811 | RIML,SAADR,1
2812 | RIML,SAAVL,3
2813 | RIML,SAAVR,2
2814 | RIML,SMDDR,5
2815 | RIML,SMDVL,1
2816 | RIMR,ADAR,1
2817 | RIMR,AIBL,4
2818 | RIMR,AIBL,1
2819 | RIMR,AIYR,1
2820 | RIMR,AVAL,2
2821 | RIMR,AVAL,3
2822 | RIMR,AVAR,1
2823 | RIMR,AVBL,2
2824 | RIMR,AVBR,5
2825 | RIMR,AVEL,3
2826 | RIMR,AVER,2
2827 | RIMR,AVJL,1
2828 | RIMR,AVKL,1
2829 | RIMR,MDL05,1
2830 | RIMR,MDL07,1
2831 | RIMR,MVL05,1
2832 | RIMR,MVL07,1
2833 | RIMR,RIBR,1
2834 | RIMR,RIS,1
2835 | RIMR,RIS,1
2836 | RIMR,RMDL,3
2837 | RIMR,RMDR,1
2838 | RIMR,RMFL,1
2839 | RIMR,RMFR,1
2840 | RIMR,SAAVL,3
2841 | RIMR,SAAVR,3
2842 | RIMR,SMDDL,2
2843 | RIMR,SMDDR,4
2844 | RIPL,OLQDL,1
2845 | RIPL,OLQDR,1
2846 | RIPL,RMED,1
2847 | RIPR,OLQDL,1
2848 | RIPR,OLQDR,1
2849 | RIPR,RMED,1
2850 | RIR,AFDR,1
2851 | RIR,AIZL,3
2852 | RIR,AIZR,5
2853 | RIR,AUAL,1
2854 | RIR,AWBR,1
2855 | RIR,BAGL,1
2856 | RIR,BAGR,1
2857 | RIR,BAGR,1
2858 | RIR,DVA,2
2859 | RIR,HSNL,1
2860 | RIR,PVPL,1
2861 | RIR,RIAL,5
2862 | RIR,RIAR,1
2863 | RIR,RIGL,1
2864 | RIR,URXL,5
2865 | RIR,URXR,1
2866 | RIS,AIBR,1
2867 | RIS,AVEL,7
2868 | RIS,AVER,7
2869 | RIS,AVJL,1
2870 | RIS,AVKL,1
2871 | RIS,AVKR,4
2872 | RIS,AVL,2
2873 | RIS,CEPDR,1
2874 | RIS,CEPVL,2
2875 | RIS,CEPVR,1
2876 | RIS,DB1,1
2877 | RIS,OLLR,1
2878 | RIS,RIBL,3
2879 | RIS,RIBR,5
2880 | RIS,RIML,1
2881 | RIS,RIML,1
2882 | RIS,RIMR,4
2883 | RIS,RIMR,1
2884 | RIS,RMDDL,1
2885 | RIS,RMDL,2
2886 | RIS,RMDR,4
2887 | RIS,SMDDL,1
2888 | RIS,SMDDR,2
2889 | RIS,SMDDR,1
2890 | RIS,SMDVL,1
2891 | RIS,SMDVR,1
2892 | RIS,URYVR,1
2893 | RIVL,AIBL,1
2894 | RIVL,MVR05,-1
2895 | RIVL,MVR06,-1
2896 | RIVL,MVR08,-2
2897 | RIVL,RIAL,1
2898 | RIVL,RIAR,1
2899 | RIVL,RIVR,2
2900 | RIVL,RMDL,2
2901 | RIVL,SAADR,3
2902 | RIVL,SDQR,2
2903 | RIVL,SIAVR,2
2904 | RIVL,SMDDR,1
2905 | RIVL,SMDVL,1
2906 | RIVR,AIBR,1
2907 | RIVR,MVL05,-1
2908 | RIVR,MVL06,-1
2909 | RIVR,MVL08,-1
2910 | RIVR,MVR04,-1
2911 | RIVR,MVR06,-1
2912 | RIVR,RIAL,2
2913 | RIVR,RIAR,1
2914 | RIVR,RIVL,2
2915 | RIVR,RMDDL,1
2916 | RIVR,RMDR,1
2917 | RIVR,RMDVR,1
2918 | RIVR,RMEV,1
2919 | RIVR,SAADL,2
2920 | RIVR,SDQR,2
2921 | RIVR,SIAVL,2
2922 | RIVR,SMDDL,2
2923 | RIVR,SMDVR,2
2924 | RIVR,SMDVR,2
2925 | RMDDL,MDR01,1
2926 | RMDDL,MDR02,1
2927 | RMDDL,MDR03,1
2928 | RMDDL,MDR04,1
2929 | RMDDL,MDR08,2
2930 | RMDDL,MVR01,1
2931 | RMDDL,OLQVL,1
2932 | RMDDL,RMDL,1
2933 | RMDDL,RMDVL,1
2934 | RMDDL,RMDVR,7
2935 | RMDDL,SMDDL,1
2936 | RMDDR,MDL01,1
2937 | RMDDR,MDL02,1
2938 | RMDDR,MDL03,2
2939 | RMDDR,MDL04,1
2940 | RMDDR,MDR04,1
2941 | RMDDR,MVR01,1
2942 | RMDDR,MVR02,1
2943 | RMDDR,OLQVR,1
2944 | RMDDR,RMDVL,12
2945 | RMDDR,RMDVR,1
2946 | RMDDR,SAADR,1
2947 | RMDDR,SMDDR,1
2948 | RMDDR,URYDL,1
2949 | RMDL,MDL03,1
2950 | RMDL,MDL05,2
2951 | RMDL,MDR01,1
2952 | RMDL,MDR03,1
2953 | RMDL,MVL01,1
2954 | RMDL,MVR01,1
2955 | RMDL,MVR03,1
2956 | RMDL,MVR05,2
2957 | RMDL,MVR07,1
2958 | RMDL,OLLR,2
2959 | RMDL,RIAL,4
2960 | RMDL,RIAR,3
2961 | RMDL,RMDDL,1
2962 | RMDL,RMDDR,1
2963 | RMDL,RMDR,3
2964 | RMDL,RMDVL,1
2965 | RMDL,RMER,1
2966 | RMDL,RMFL,1
2967 | RMDR,AVKL,1
2968 | RMDR,MDL03,1
2969 | RMDR,MDL05,1
2970 | RMDR,MDR05,1
2971 | RMDR,MVL03,1
2972 | RMDR,MVL05,1
2973 | RMDR,RIAL,3
2974 | RMDR,RIAR,7
2975 | RMDR,RIMR,2
2976 | RMDR,RIS,1
2977 | RMDR,RMDDL,1
2978 | RMDR,RMDL,1
2979 | RMDR,RMDVR,1
2980 | RMDVL,AVER,1
2981 | RMDVL,MDR01,1
2982 | RMDVL,MVL04,1
2983 | RMDVL,MVR01,1
2984 | RMDVL,MVR02,1
2985 | RMDVL,MVR03,1
2986 | RMDVL,MVR04,1
2987 | RMDVL,MVR05,1
2988 | RMDVL,MVR06,1
2989 | RMDVL,MVR08,1
2990 | RMDVL,OLQDL,1
2991 | RMDVL,RMDDL,1
2992 | RMDVL,RMDDR,6
2993 | RMDVL,RMDL,1
2994 | RMDVL,RMDVR,1
2995 | RMDVL,SAAVL,1
2996 | RMDVL,SMDVL,1
2997 | RMDVR,AVEL,1
2998 | RMDVR,AVER,1
2999 | RMDVR,MDL01,1
3000 | RMDVR,MVL01,1
3001 | RMDVR,MVL02,1
3002 | RMDVR,MVL03,1
3003 | RMDVR,MVL04,1
3004 | RMDVR,MVL05,1
3005 | RMDVR,MVL06,1
3006 | RMDVR,MVL08,1
3007 | RMDVR,MVR04,1
3008 | RMDVR,MVR06,1
3009 | RMDVR,MVR08,1
3010 | RMDVR,OLQDR,1
3011 | RMDVR,RMDDL,4
3012 | RMDVR,RMDDR,1
3013 | RMDVR,RMDR,1
3014 | RMDVR,RMDVL,1
3015 | RMDVR,SAAVR,1
3016 | RMDVR,SIBDR,1
3017 | RMDVR,SIBVR,1
3018 | RMDVR,SMDVR,1
3019 | RMED,IL1VL,1
3020 | RMED,MVL02,-2
3021 | RMED,MVL04,-2
3022 | RMED,MVL06,-2
3023 | RMED,MVR02,-2
3024 | RMED,MVR04,-2
3025 | RMED,RIBL,1
3026 | RMED,RIBR,1
3027 | RMED,RIPL,1
3028 | RMED,RIPR,1
3029 | RMED,RMEV,2
3030 | RMEL,MDR01,-3
3031 | RMEL,MDR03,-3
3032 | RMEL,MVR01,-3
3033 | RMEL,MVR03,-3
3034 | RMEL,RIGL,1
3035 | RMEL,RMEV,1
3036 | RMER,MDL01,-5
3037 | RMER,MDL03,-5
3038 | RMER,MVL01,-5
3039 | RMER,RMEV,1
3040 | RMEV,AVEL,1
3041 | RMEV,AVER,1
3042 | RMEV,IL1DL,1
3043 | RMEV,IL1DR,1
3044 | RMEV,MDL02,-1
3045 | RMEV,MDL04,-1
3046 | RMEV,MDL06,-1
3047 | RMEV,MDR02,-1
3048 | RMEV,MDR04,-1
3049 | RMEV,RMED,2
3050 | RMEV,RMEL,1
3051 | RMEV,RMER,1
3052 | RMEV,SMDDR,1
3053 | RMFL,AVKL,4
3054 | RMFL,AVKR,4
3055 | RMFL,MDR03,1
3056 | RMFL,MVR01,1
3057 | RMFL,MVR03,1
3058 | RMFL,PVT,1
3059 | RMFL,RIGR,1
3060 | RMFL,RMDR,3
3061 | RMFL,RMGR,1
3062 | RMFL,URBR,1
3063 | RMFR,AVKL,3
3064 | RMFR,AVKR,3
3065 | RMFR,RMDL,2
3066 | RMGL,ADAL,1
3067 | RMGL,ADLL,1
3068 | RMGL,AIBR,1
3069 | RMGL,ALML,1
3070 | RMGL,ALNL,1
3071 | RMGL,ASHL,1
3072 | RMGL,ASHL,1
3073 | RMGL,ASKL,1
3074 | RMGL,AVAL,1
3075 | RMGL,AVBR,2
3076 | RMGL,AVEL,2
3077 | RMGL,AWBL,1
3078 | RMGL,CEPDL,1
3079 | RMGL,IL2L,1
3080 | RMGL,MDL05,2
3081 | RMGL,MVL05,2
3082 | RMGL,RID,1
3083 | RMGL,RMDL,1
3084 | RMGL,RMDR,3
3085 | RMGL,RMDVL,3
3086 | RMGL,RMHL,3
3087 | RMGL,RMHR,1
3088 | RMGL,SIAVL,1
3089 | RMGL,SIBVL,2
3090 | RMGL,SIBVR,1
3091 | RMGL,SMBVL,1
3092 | RMGL,URXL,1
3093 | RMGL,URXL,1
3094 | RMGR,ADAR,1
3095 | RMGR,AIMR,1
3096 | RMGR,ALNR,1
3097 | RMGR,ASHR,1
3098 | RMGR,ASHR,1
3099 | RMGR,ASKR,1
3100 | RMGR,AVAR,1
3101 | RMGR,AVBR,1
3102 | RMGR,AVDL,1
3103 | RMGR,AVER,3
3104 | RMGR,AVJL,1
3105 | RMGR,AWBR,1
3106 | RMGR,IL2R,1
3107 | RMGR,MDR05,1
3108 | RMGR,MVR05,1
3109 | RMGR,MVR07,1
3110 | RMGR,RIR,1
3111 | RMGR,RMDL,4
3112 | RMGR,RMDR,2
3113 | RMGR,RMDVR,5
3114 | RMGR,RMHR,1
3115 | RMGR,URXR,1
3116 | RMGR,URXR,1
3117 | RMHL,MDR01,2
3118 | RMHL,MDR03,3
3119 | RMHL,MVR01,2
3120 | RMHL,RMDR,1
3121 | RMHL,RMGL,3
3122 | RMHL,SIBVR,1
3123 | RMHR,MDL01,2
3124 | RMHR,MDL03,2
3125 | RMHR,MDL05,2
3126 | RMHR,MVL01,2
3127 | RMHR,RMER,1
3128 | RMHR,RMGL,1
3129 | RMHR,RMGR,1
3130 | SAADL,AIBL,1
3131 | SAADL,AVAL,6
3132 | SAADL,RIML,3
3133 | SAADL,RIMR,6
3134 | SAADL,RMGR,1
3135 | SAADL,SMBDL,1
3136 | SAADR,AIBR,1
3137 | SAADR,AVAR,3
3138 | SAADR,OLLL,1
3139 | SAADR,RIML,4
3140 | SAADR,RIMR,5
3141 | SAADR,RMDDR,1
3142 | SAADR,RMFL,1
3143 | SAADR,RMGL,1
3144 | SAAVL,AIBL,1
3145 | SAAVL,ALNL,1
3146 | SAAVL,AVAL,16
3147 | SAAVL,OLLR,1
3148 | SAAVL,RIML,2
3149 | SAAVL,RIMR,12
3150 | SAAVL,RMDVL,1
3151 | SAAVL,RMFR,2
3152 | SAAVL,SMBVR,3
3153 | SAAVL,SMDDR,8
3154 | SAAVR,AVAR,13
3155 | SAAVR,RIML,5
3156 | SAAVR,RIMR,2
3157 | SAAVR,RMDVR,1
3158 | SAAVR,SMBVL,2
3159 | SAAVR,SMDDL,6
3160 | SABD,AVAL,4
3161 | SABD,VA2,1
3162 | SABD,VA2,3
3163 | SABD,VA3,2
3164 | SABD,VA4,1
3165 | SABVL,AVAR,3
3166 | SABVL,DA1,2
3167 | SABVL,DA2,1
3168 | SABVR,AVAL,1
3169 | SABVR,AVAR,1
3170 | SABVR,DA1,3
3171 | SDQL,ALML,2
3172 | SDQL,AVAL,1
3173 | SDQL,AVAR,3
3174 | SDQL,AVEL,1
3175 | SDQL,FLPL,1
3176 | SDQL,RICR,1
3177 | SDQL,RIS,3
3178 | SDQL,RMFL,1
3179 | SDQL,SDQR,1
3180 | SDQR,ADLL,1
3181 | SDQR,AIBL,2
3182 | SDQR,AVAL,2
3183 | SDQR,AVAL,1
3184 | SDQR,AVBL,6
3185 | SDQR,AVBL,1
3186 | SDQR,AVBR,4
3187 | SDQR,DVA,3
3188 | SDQR,RICR,1
3189 | SDQR,RIVL,2
3190 | SDQR,RIVR,2
3191 | SDQR,RMHL,2
3192 | SDQR,RMHR,1
3193 | SDQR,SDQL,1
3194 | SDQR,SIBVL,1
3195 | SIADL,RIBL,1
3196 | SIADR,RIBR,1
3197 | SIAVL,RIBL,1
3198 | SIAVR,RIBR,1
3199 | SIBDL,RIBL,1
3200 | SIBDL,SIBVL,1
3201 | SIBDR,AIML,1
3202 | SIBDR,RIBR,1
3203 | SIBDR,SIBVR,1
3204 | SIBVL,AVBL,1
3205 | SIBVL,AVBR,1
3206 | SIBVL,RIBL,1
3207 | SIBVL,SDQR,1
3208 | SIBVL,SIBDL,1
3209 | SIBVR,RIBL,1
3210 | SIBVR,RIBR,1
3211 | SIBVR,RMHL,1
3212 | SIBVR,SIBDR,1
3213 | SMBDL,AVAR,1
3214 | SMBDL,AVKL,1
3215 | SMBDL,AVKR,1
3216 | SMBDL,MDR01,2
3217 | SMBDL,MDR02,2
3218 | SMBDL,MDR03,2
3219 | SMBDL,MDR04,2
3220 | SMBDL,MDR06,3
3221 | SMBDL,RIBL,1
3222 | SMBDL,RMED,3
3223 | SMBDL,SAADL,1
3224 | SMBDL,SAAVR,1
3225 | SMBDR,ALNL,1
3226 | SMBDR,AVAL,1
3227 | SMBDR,AVKL,1
3228 | SMBDR,AVKR,2
3229 | SMBDR,MDL02,1
3230 | SMBDR,MDL03,1
3231 | SMBDR,MDL04,1
3232 | SMBDR,MDL06,2
3233 | SMBDR,MDR04,1
3234 | SMBDR,MDR08,1
3235 | SMBDR,RIBR,1
3236 | SMBDR,RMED,4
3237 | SMBDR,SAAVL,3
3238 | SMBVL,MVL01,1
3239 | SMBVL,MVL02,1
3240 | SMBVL,MVL03,1
3241 | SMBVL,MVL04,1
3242 | SMBVL,MVL05,1
3243 | SMBVL,MVL06,1
3244 | SMBVL,MVL08,1
3245 | SMBVL,PLNL,1
3246 | SMBVL,RMEV,5
3247 | SMBVL,SAADL,3
3248 | SMBVL,SAAVR,2
3249 | SMBVR,AVKL,1
3250 | SMBVR,AVKR,1
3251 | SMBVR,MVR01,1
3252 | SMBVR,MVR02,1
3253 | SMBVR,MVR03,1
3254 | SMBVR,MVR04,1
3255 | SMBVR,MVR06,1
3256 | SMBVR,MVR07,1
3257 | SMBVR,RMEV,3
3258 | SMBVR,SAADR,4
3259 | SMBVR,SAAVL,3
3260 | SMDDL,MDL04,1
3261 | SMDDL,MDL06,1
3262 | SMDDL,MDL08,1
3263 | SMDDL,MDR02,1
3264 | SMDDL,MDR03,1
3265 | SMDDL,MDR04,1
3266 | SMDDL,MDR05,1
3267 | SMDDL,MDR06,1
3268 | SMDDL,MDR07,1
3269 | SMDDL,MVL02,1
3270 | SMDDL,MVL04,1
3271 | SMDDL,RIAL,1
3272 | SMDDL,RIAR,1
3273 | SMDDL,RIBL,1
3274 | SMDDL,RIBR,1
3275 | SMDDL,RIS,1
3276 | SMDDL,RMDDL,1
3277 | SMDDL,SMDVR,2
3278 | SMDDR,MDL04,1
3279 | SMDDR,MDL05,1
3280 | SMDDR,MDL06,1
3281 | SMDDR,MDL08,1
3282 | SMDDR,MDR04,1
3283 | SMDDR,MDR06,1
3284 | SMDDR,MVR02,1
3285 | SMDDR,RIAL,2
3286 | SMDDR,RIAR,1
3287 | SMDDR,RIBR,1
3288 | SMDDR,RIS,1
3289 | SMDDR,RMDDR,1
3290 | SMDDR,VD1,1
3291 | SMDVL,MVL03,1
3292 | SMDVL,MVL06,1
3293 | SMDVL,MVR02,1
3294 | SMDVL,MVR03,1
3295 | SMDVL,MVR04,1
3296 | SMDVL,MVR06,1
3297 | SMDVL,PVR,1
3298 | SMDVL,RIAL,3
3299 | SMDVL,RIAR,8
3300 | SMDVL,RIBR,2
3301 | SMDVL,RIS,1
3302 | SMDVL,RIVL,1
3303 | SMDVL,RIVL,1
3304 | SMDVL,RMDDR,1
3305 | SMDVL,RMDVL,1
3306 | SMDVL,SMDDR,4
3307 | SMDVL,SMDVR,1
3308 | SMDVR,MVL02,1
3309 | SMDVR,MVL03,1
3310 | SMDVR,MVL04,1
3311 | SMDVR,MVR07,1
3312 | SMDVR,RIAL,7
3313 | SMDVR,RIAR,5
3314 | SMDVR,RIBL,2
3315 | SMDVR,RIVR,1
3316 | SMDVR,RIVR,2
3317 | SMDVR,RMDDL,1
3318 | SMDVR,RMDVR,1
3319 | SMDVR,SMDDL,2
3320 | SMDVR,SMDVL,1
3321 | SMDVR,VB1,1
3322 | URADL,IL1DL,2
3323 | URADL,MDL02,2
3324 | URADL,MDL03,2
3325 | URADL,MDL04,2
3326 | URADL,RIPL,3
3327 | URADL,RMEL,1
3328 | URADR,IL1DR,1
3329 | URADR,MDR01,3
3330 | URADR,MDR02,2
3331 | URADR,MDR03,3
3332 | URADR,RIPR,3
3333 | URADR,RMDVR,1
3334 | URADR,RMED,1
3335 | URADR,RMER,1
3336 | URADR,URYDR,1
3337 | URAVL,MVL01,2
3338 | URAVL,MVL02,2
3339 | URAVL,MVL03,3
3340 | URAVL,MVL04,2
3341 | URAVL,RIPL,3
3342 | URAVL,RMEL,1
3343 | URAVL,RMER,1
3344 | URAVL,RMEV,2
3345 | URAVR,IL1R,1
3346 | URAVR,MVR01,2
3347 | URAVR,MVR02,2
3348 | URAVR,MVR03,2
3349 | URAVR,MVR04,2
3350 | URAVR,RIPR,3
3351 | URAVR,RMDVL,1
3352 | URAVR,RMER,2
3353 | URAVR,RMEV,2
3354 | URBL,AVBL,1
3355 | URBL,CEPDL,1
3356 | URBL,IL1L,1
3357 | URBL,OLQDL,1
3358 | URBL,OLQVL,1
3359 | URBL,RICR,1
3360 | URBL,RMDDR,1
3361 | URBL,SIAVL,1
3362 | URBL,SMBDR,1
3363 | URBL,URXL,2
3364 | URBR,ADAR,1
3365 | URBR,AVBR,1
3366 | URBR,CEPDR,1
3367 | URBR,IL1R,3
3368 | URBR,IL2R,1
3369 | URBR,OLQDR,1
3370 | URBR,OLQVR,1
3371 | URBR,RICR,1
3372 | URBR,RMDL,1
3373 | URBR,RMDR,1
3374 | URBR,RMFL,1
3375 | URBR,SIAVR,2
3376 | URBR,SMBDL,1
3377 | URBR,URXR,4
3378 | URXL,ASHL,1
3379 | URXL,AUAL,5
3380 | URXL,AVBL,1
3381 | URXL,AVEL,4
3382 | URXL,AVJR,1
3383 | URXL,RIAL,8
3384 | URXL,RICL,1
3385 | URXL,RIGL,3
3386 | URXL,RMGL,2
3387 | URXL,RMGL,1
3388 | URXR,AUAR,4
3389 | URXR,AVBL,1
3390 | URXR,AVBR,2
3391 | URXR,AVER,2
3392 | URXR,IL2R,1
3393 | URXR,OLQVR,1
3394 | URXR,RIAR,3
3395 | URXR,RIGR,2
3396 | URXR,RIPR,3
3397 | URXR,RMDR,1
3398 | URXR,RMGR,1
3399 | URXR,RMGR,1
3400 | URXR,SIAVR,1
3401 | URYDL,AVAL,1
3402 | URYDL,AVER,2
3403 | URYDL,RIBL,1
3404 | URYDL,RIGL,1
3405 | URYDL,RMDDR,4
3406 | URYDL,RMDVL,6
3407 | URYDL,SMDDL,1
3408 | URYDL,SMDDR,1
3409 | URYDR,AVAR,1
3410 | URYDR,AVEL,2
3411 | URYDR,AVER,2
3412 | URYDR,RIBR,1
3413 | URYDR,RIGR,1
3414 | URYDR,RMDDL,3
3415 | URYDR,RMDVR,5
3416 | URYDR,SMDDL,4
3417 | URYVL,AVAR,1
3418 | URYVL,AVBR,1
3419 | URYVL,AVER,5
3420 | URYVL,IL1VL,1
3421 | URYVL,RIAL,1
3422 | URYVL,RIBL,2
3423 | URYVL,RIGL,1
3424 | URYVL,RIH,1
3425 | URYVL,RIS,1
3426 | URYVL,RMDDL,4
3427 | URYVL,RMDVR,2
3428 | URYVL,SIBVR,1
3429 | URYVL,SMDVR,4
3430 | URYVR,AVAL,1
3431 | URYVR,AVAL,1
3432 | URYVR,AVEL,6
3433 | URYVR,IL1VR,1
3434 | URYVR,RIAR,1
3435 | URYVR,RIBR,1
3436 | URYVR,RIGR,1
3437 | URYVR,RMDDR,6
3438 | URYVR,RMDVL,4
3439 | URYVR,SIBDR,1
3440 | URYVR,SIBVL,1
3441 | URYVR,SMDVL,3
3442 | VA1,AVAL,3
3443 | VA1,DA2,2
3444 | VA1,DD1,9
3445 | VA1,MVL07,3
3446 | VA1,MVL08,3
3447 | VA1,MVR07,3
3448 | VA1,MVR08,3
3449 | VA1,VD1,2
3450 | VA10,AVAL,1
3451 | VA10,AVAR,1
3452 | VA10,MVL17,5
3453 | VA10,MVL18,5
3454 | VA10,MVR17,5
3455 | VA10,MVR18,5
3456 | VA11,AVAL,1
3457 | VA11,AVAR,7
3458 | VA11,DD6,10
3459 | VA11,MVL19,5
3460 | VA11,MVL20,5
3461 | VA11,MVR19,5
3462 | VA11,MVR20,5
3463 | VA11,PVNR,2
3464 | VA11,VB10,1
3465 | VA11,VD12,4
3466 | VA12,AS11,2
3467 | VA12,AVAR,1
3468 | VA12,DA8,3
3469 | VA12,DA9,5
3470 | VA12,DB7,4
3471 | VA12,DD6,2
3472 | VA12,LUAL,2
3473 | VA12,MVL21,5
3474 | VA12,MVL22,5
3475 | VA12,MVL23,5
3476 | VA12,MVR21,5
3477 | VA12,MVR22,5
3478 | VA12,MVR23,5
3479 | VA12,MVR24,5
3480 | VA12,PHCL,1
3481 | VA12,PHCR,1
3482 | VA12,PVCL,2
3483 | VA12,PVCR,3
3484 | VA12,VA11,1
3485 | VA12,VB11,1
3486 | VA12,VD12,3
3487 | VA12,VD13,11
3488 | VA2,AVAL,1
3489 | VA2,AVAL,4
3490 | VA2,DD1,13
3491 | VA2,MVL07,5
3492 | VA2,MVL10,5
3493 | VA2,MVR07,5
3494 | VA2,MVR10,5
3495 | VA2,SABD,3
3496 | VA2,VA3,2
3497 | VA2,VB1,2
3498 | VA2,VD1,2
3499 | VA2,VD1,1
3500 | VA2,VD2,8
3501 | VA2,VD2,3
3502 | VA3,AS1,1
3503 | VA3,AVAL,1
3504 | VA3,AVAR,2
3505 | VA3,DD1,18
3506 | VA3,DD2,11
3507 | VA3,MVL09,5
3508 | VA3,MVL10,5
3509 | VA3,MVL12,5
3510 | VA3,MVR09,5
3511 | VA3,MVR10,5
3512 | VA3,MVR12,5
3513 | VA3,SABD,2
3514 | VA3,VA4,1
3515 | VA3,VD2,3
3516 | VA3,VD3,3
3517 | VA4,AS2,2
3518 | VA4,AVAL,1
3519 | VA4,AVAR,3
3520 | VA4,AVDL,1
3521 | VA4,DA5,1
3522 | VA4,DD2,21
3523 | VA4,MVL11,6
3524 | VA4,MVL12,6
3525 | VA4,MVR11,6
3526 | VA4,MVR12,6
3527 | VA4,SABD,1
3528 | VA4,VB3,2
3529 | VA4,VD4,3
3530 | VA5,AS3,2
3531 | VA5,AVAL,5
3532 | VA5,AVAR,3
3533 | VA5,DA5,2
3534 | VA5,DD2,5
3535 | VA5,DD3,13
3536 | VA5,MVL11,5
3537 | VA5,MVL14,5
3538 | VA5,MVR11,5
3539 | VA5,MVR14,5
3540 | VA5,VD5,2
3541 | VA6,AVAL,6
3542 | VA6,AVAR,2
3543 | VA6,DD3,24
3544 | VA6,MVL13,5
3545 | VA6,MVL14,5
3546 | VA6,MVR13,5
3547 | VA6,MVR14,5
3548 | VA6,VB5,2
3549 | VA6,VD5,1
3550 | VA6,VD6,2
3551 | VA7,AS5,1
3552 | VA7,AVAL,2
3553 | VA7,AVAR,4
3554 | VA7,DD3,3
3555 | VA7,DD4,12
3556 | VA7,MVL13,4
3557 | VA7,MVL15,4
3558 | VA7,MVL16,4
3559 | VA7,MVR13,4
3560 | VA7,MVR15,4
3561 | VA7,MVR16,4
3562 | VA7,MVULVA,4
3563 | VA7,VB3,1
3564 | VA7,VD7,9
3565 | VA8,AS6,1
3566 | VA8,AVAL,10
3567 | VA8,AVAR,4
3568 | VA8,AVBR,1
3569 | VA8,DD4,21
3570 | VA8,MVL15,6
3571 | VA8,MVL16,6
3572 | VA8,MVR15,6
3573 | VA8,MVR16,6
3574 | VA8,PDER,1
3575 | VA8,PVCR,2
3576 | VA8,VA8,1
3577 | VA8,VA9,1
3578 | VA8,VB6,1
3579 | VA8,VB8,1
3580 | VA8,VB8,3
3581 | VA8,VB9,3
3582 | VA8,VD7,5
3583 | VA8,VD8,5
3584 | VA8,VD8,1
3585 | VA9,AVAL,1
3586 | VA9,AVBR,1
3587 | VA9,DD4,3
3588 | VA9,DD5,15
3589 | VA9,DVB,1
3590 | VA9,DVC,1
3591 | VA9,MVL15,5
3592 | VA9,MVL18,5
3593 | VA9,MVR15,5
3594 | VA9,MVR18,5
3595 | VA9,PVCR,1
3596 | VA9,PVT,1
3597 | VA9,VB8,6
3598 | VA9,VB8,1
3599 | VA9,VB9,4
3600 | VA9,VD7,1
3601 | VA9,VD9,10
3602 | VB1,AIBR,1
3603 | VB1,AVBL,1
3604 | VB1,AVKL,4
3605 | VB1,DB2,2
3606 | VB1,DD1,1
3607 | VB1,DVA,1
3608 | VB1,MVL07,1
3609 | VB1,MVL08,1
3610 | VB1,MVR07,1
3611 | VB1,MVR08,1
3612 | VB1,RIML,2
3613 | VB1,RMFL,2
3614 | VB1,SAADL,9
3615 | VB1,SAADR,2
3616 | VB1,SABD,1
3617 | VB1,SMDVR,1
3618 | VB1,VA1,3
3619 | VB1,VA3,1
3620 | VB1,VB2,4
3621 | VB1,VD1,3
3622 | VB1,VD2,1
3623 | VB10,AVBL,2
3624 | VB10,AVBR,1
3625 | VB10,AVKL,1
3626 | VB10,DD6,9
3627 | VB10,MVL19,5
3628 | VB10,MVL20,5
3629 | VB10,MVR19,5
3630 | VB10,MVR20,5
3631 | VB10,PVCL,1
3632 | VB10,PVT,1
3633 | VB10,VD11,1
3634 | VB10,VD12,2
3635 | VB11,AVBL,2
3636 | VB11,AVBR,1
3637 | VB11,DD6,7
3638 | VB11,MVL21,5
3639 | VB11,MVL22,5
3640 | VB11,MVL23,5
3641 | VB11,MVR21,5
3642 | VB11,MVR22,5
3643 | VB11,MVR23,5
3644 | VB11,MVR24,5
3645 | VB11,PVCR,1
3646 | VB11,VA12,1
3647 | VB11,VA12,1
3648 | VB2,AVBL,3
3649 | VB2,AVBR,1
3650 | VB2,DB4,1
3651 | VB2,DD1,20
3652 | VB2,DD2,1
3653 | VB2,MVL07,4
3654 | VB2,MVL09,4
3655 | VB2,MVL10,4
3656 | VB2,MVL12,4
3657 | VB2,MVR07,4
3658 | VB2,MVR09,4
3659 | VB2,MVR10,4
3660 | VB2,MVR12,4
3661 | VB2,RIGL,1
3662 | VB2,VA2,1
3663 | VB2,VB1,4
3664 | VB2,VB3,1
3665 | VB2,VB5,1
3666 | VB2,VB7,2
3667 | VB2,VC2,1
3668 | VB2,VD2,9
3669 | VB2,VD3,3
3670 | VB3,AVBR,1
3671 | VB3,DB1,1
3672 | VB3,DD2,37
3673 | VB3,MVL11,6
3674 | VB3,MVL12,6
3675 | VB3,MVL14,6
3676 | VB3,MVR11,6
3677 | VB3,MVR12,6
3678 | VB3,MVR14,6
3679 | VB3,VA4,1
3680 | VB3,VA7,1
3681 | VB3,VB2,1
3682 | VB4,AVBL,1
3683 | VB4,AVBR,1
3684 | VB4,DB1,1
3685 | VB4,DB4,1
3686 | VB4,DD2,6
3687 | VB4,DD3,16
3688 | VB4,MVL11,5
3689 | VB4,MVL14,5
3690 | VB4,MVR11,5
3691 | VB4,MVR14,5
3692 | VB4,VB5,1
3693 | VB5,AVBL,1
3694 | VB5,DD3,27
3695 | VB5,MVL13,6
3696 | VB5,MVL14,6
3697 | VB5,MVR13,6
3698 | VB5,MVR14,6
3699 | VB5,VB2,1
3700 | VB5,VB4,1
3701 | VB5,VB6,1
3702 | VB5,VD6,7
3703 | VB6,AVBL,1
3704 | VB6,AVBR,2
3705 | VB6,DA4,1
3706 | VB6,DD4,30
3707 | VB6,MVL15,6
3708 | VB6,MVL16,6
3709 | VB6,MVR15,6
3710 | VB6,MVR16,6
3711 | VB6,MVULVA,6
3712 | VB6,VA8,1
3713 | VB6,VB5,1
3714 | VB6,VB7,1
3715 | VB6,VD6,1
3716 | VB6,VD7,8
3717 | VB7,AVBL,2
3718 | VB7,AVBR,2
3719 | VB7,DD4,2
3720 | VB7,MVL15,5
3721 | VB7,MVR15,5
3722 | VB7,VB2,2
3723 | VB8,AVBL,7
3724 | VB8,AVBR,3
3725 | VB8,DD5,30
3726 | VB8,MVL17,5
3727 | VB8,MVL18,5
3728 | VB8,MVL20,5
3729 | VB8,MVR17,5
3730 | VB8,MVR18,5
3731 | VB8,MVR20,5
3732 | VB8,VA8,3
3733 | VB8,VA9,9
3734 | VB8,VA9,1
3735 | VB8,VB9,3
3736 | VB8,VB9,3
3737 | VB8,VD10,1
3738 | VB8,VD9,10
3739 | VB9,AVAL,5
3740 | VB9,AVAR,4
3741 | VB9,AVBL,1
3742 | VB9,AVBR,6
3743 | VB9,DD5,8
3744 | VB9,DVB,1
3745 | VB9,MVL17,6
3746 | VB9,MVL20,6
3747 | VB9,MVR17,6
3748 | VB9,MVR20,6
3749 | VB9,PVCL,2
3750 | VB9,VA8,3
3751 | VB9,VA9,4
3752 | VB9,VB8,1
3753 | VB9,VB8,3
3754 | VB9,VD10,5
3755 | VC1,AVL,2
3756 | VC1,DD1,7
3757 | VC1,DD2,6
3758 | VC1,DD3,6
3759 | VC1,DVC,1
3760 | VC1,MVULVA,6
3761 | VC1,PVT,2
3762 | VC1,VC2,3
3763 | VC1,VC2,6
3764 | VC1,VC3,1
3765 | VC1,VC3,2
3766 | VC1,VD1,4
3767 | VC1,VD1,1
3768 | VC1,VD2,1
3769 | VC1,VD3,1
3770 | VC1,VD4,2
3771 | VC1,VD5,5
3772 | VC1,VD6,1
3773 | VC2,DB4,1
3774 | VC2,DD1,6
3775 | VC2,DD2,4
3776 | VC2,DD3,9
3777 | VC2,DVC,1
3778 | VC2,MVULVA,10
3779 | VC2,PVCR,1
3780 | VC2,PVQR,1
3781 | VC2,PVT,2
3782 | VC2,VC1,4
3783 | VC2,VC1,6
3784 | VC2,VC3,4
3785 | VC2,VC3,2
3786 | VC2,VD1,2
3787 | VC2,VD2,2
3788 | VC2,VD4,5
3789 | VC2,VD5,5
3790 | VC2,VD6,1
3791 | VC3,AVL,1
3792 | VC3,DD1,2
3793 | VC3,DD2,4
3794 | VC3,DD3,5
3795 | VC3,DD4,12
3796 | VC3,DD4,1
3797 | VC3,DVC,1
3798 | VC3,HSNR,1
3799 | VC3,MVULVA,11
3800 | VC3,PVNR,1
3801 | VC3,PVPR,1
3802 | VC3,PVQR,4
3803 | VC3,VC1,2
3804 | VC3,VC1,2
3805 | VC3,VC2,1
3806 | VC3,VC2,2
3807 | VC3,VC4,1
3808 | VC3,VC5,2
3809 | VC3,VD1,1
3810 | VC3,VD2,1
3811 | VC3,VD3,1
3812 | VC3,VD4,2
3813 | VC3,VD5,4
3814 | VC3,VD6,4
3815 | VC3,VD7,5
3816 | VC4,AVBL,1
3817 | VC4,AVFR,1
3818 | VC4,AVHR,1
3819 | VC4,MVULVA,7
3820 | VC4,VC1,1
3821 | VC4,VC3,4
3822 | VC4,VC3,1
3823 | VC4,VC5,1
3824 | VC4,VC5,1
3825 | VC5,AVFL,1
3826 | VC5,AVFR,1
3827 | VC5,DVC,2
3828 | VC5,HSNL,1
3829 | VC5,MVULVA,2
3830 | VC5,OLLR,1
3831 | VC5,PVT,1
3832 | VC5,URBL,3
3833 | VC5,VC3,1
3834 | VC5,VC3,2
3835 | VC5,VC4,1
3836 | VC5,VC4,1
3837 | VC6,MVULVA,1
3838 | VD1,DD1,1
3839 | VD1,DD1,4
3840 | VD1,DVC,5
3841 | VD1,MVL05,-3
3842 | VD1,MVL08,-3
3843 | VD1,MVR05,-3
3844 | VD1,MVR08,-3
3845 | VD1,RIFL,1
3846 | VD1,RIGL,2
3847 | VD1,SMDDR,1
3848 | VD1,VA1,2
3849 | VD1,VA2,1
3850 | VD1,VC1,1
3851 | VD1,VD2,7
3852 | VD10,AVBR,1
3853 | VD10,DD5,1
3854 | VD10,DD5,1
3855 | VD10,DVC,4
3856 | VD10,MVL17,-6
3857 | VD10,MVL20,-6
3858 | VD10,MVR17,-6
3859 | VD10,MVR20,-6
3860 | VD10,VB9,2
3861 | VD10,VD9,5
3862 | VD11,AVAR,2
3863 | VD11,MVL19,-6
3864 | VD11,MVL20,-6
3865 | VD11,MVR19,-6
3866 | VD11,MVR20,-6
3867 | VD11,VA11,1
3868 | VD11,VB10,1
3869 | VD12,MVL19,-3
3870 | VD12,MVL21,-3
3871 | VD12,MVR19,-3
3872 | VD12,MVR22,-3
3873 | VD12,VA11,3
3874 | VD12,VA12,2
3875 | VD12,VB10,1
3876 | VD12,VB11,1
3877 | VD13,AVAR,2
3878 | VD13,MVL21,-6
3879 | VD13,MVL22,-6
3880 | VD13,MVL23,-6
3881 | VD13,MVR21,-6
3882 | VD13,MVR22,-6
3883 | VD13,MVR23,-6
3884 | VD13,MVR24,-6
3885 | VD13,PVCL,1
3886 | VD13,PVCR,1
3887 | VD13,PVPL,2
3888 | VD13,VA12,1
3889 | VD2,AS1,1
3890 | VD2,DD1,1
3891 | VD2,DD1,2
3892 | VD2,MVL07,-5
3893 | VD2,MVL10,-5
3894 | VD2,MVR07,-5
3895 | VD2,MVR10,-5
3896 | VD2,VA2,6
3897 | VD2,VA2,3
3898 | VD2,VB2,3
3899 | VD2,VD1,7
3900 | VD2,VD3,2
3901 | VD3,MVL09,-5
3902 | VD3,MVL12,-6
3903 | VD3,MVR09,-5
3904 | VD3,MVR12,-5
3905 | VD3,PVPL,1
3906 | VD3,VA3,2
3907 | VD3,VB2,2
3908 | VD3,VD2,2
3909 | VD3,VD4,1
3910 | VD4,DD2,2
3911 | VD4,MVL11,-6
3912 | VD4,MVL12,-6
3913 | VD4,MVR11,-6
3914 | VD4,MVR12,-6
3915 | VD4,PVPR,1
3916 | VD4,VD3,1
3917 | VD4,VD5,1
3918 | VD5,AVAR,1
3919 | VD5,MVL14,-13
3920 | VD5,MVR14,-13
3921 | VD5,PVPR,1
3922 | VD5,VA5,2
3923 | VD5,VB4,2
3924 | VD5,VD4,1
3925 | VD5,VD6,2
3926 | VD6,AVAL,1
3927 | VD6,MVL13,-5
3928 | VD6,MVL14,-5
3929 | VD6,MVL16,-5
3930 | VD6,MVR13,-5
3931 | VD6,MVR14,-5
3932 | VD6,MVR16,-5
3933 | VD6,VA6,1
3934 | VD6,VB5,2
3935 | VD6,VD5,2
3936 | VD6,VD7,1
3937 | VD7,MVL15,-5
3938 | VD7,MVL16,-5
3939 | VD7,MVR15,-5
3940 | VD7,MVR16,-5
3941 | VD7,MVULVA,-5
3942 | VD7,VA9,1
3943 | VD7,VD6,1
3944 | VD8,DD4,1
3945 | VD8,DD4,1
3946 | VD8,MVL15,-12
3947 | VD8,MVR15,-12
3948 | VD8,VA8,4
3949 | VD8,VA8,1
3950 | VD9,MVL17,-7
3951 | VD9,MVL18,-7
3952 | VD9,MVR17,-7
3953 | VD9,MVR18,-7
3954 | VD9,PDER,1
3955 | VD9,VD10,5
3956 |
--------------------------------------------------------------------------------
/connectome/NodesIds.csv:
--------------------------------------------------------------------------------
1 | node,id
2 | ADAL,0
3 | ADAR,1
4 | ADEL,2
5 | ADER,3
6 | ADFL,4
7 | ADFR,5
8 | ADLL,6
9 | ADLR,7
10 | AFDL,8
11 | AFDR,9
12 | AIAL,10
13 | AIAR,11
14 | AIBL,12
15 | AIBR,13
16 | AIML,14
17 | AIMR,15
18 | AINL,16
19 | AINR,17
20 | AIYL,18
21 | AIYR,19
22 | AIZL,20
23 | AIZR,21
24 | ALA,22
25 | ALML,23
26 | ALMR,24
27 | ALNL,25
28 | ALNR,26
29 | AQR,27
30 | AS1,28
31 | AS10,29
32 | AS11,30
33 | AS2,31
34 | AS3,32
35 | AS4,33
36 | AS5,34
37 | AS6,35
38 | AS7,36
39 | AS8,37
40 | AS9,38
41 | ASEL,39
42 | ASER,40
43 | ASGL,41
44 | ASGR,42
45 | ASHL,43
46 | ASHR,44
47 | ASIL,45
48 | ASIR,46
49 | ASJL,47
50 | ASJR,48
51 | ASKL,49
52 | ASKR,50
53 | AUAL,51
54 | AUAR,52
55 | AVAL,53
56 | AVAR,54
57 | AVBL,55
58 | AVBR,56
59 | AVDL,57
60 | AVDR,58
61 | AVEL,59
62 | AVER,60
63 | AVFL,61
64 | AVFR,62
65 | AVG,63
66 | AVHL,64
67 | AVHR,65
68 | AVJL,66
69 | AVJR,67
70 | AVKL,68
71 | AVKR,69
72 | AVL,70
73 | AVM,71
74 | AWAL,72
75 | AWAR,73
76 | AWBL,74
77 | AWBR,75
78 | AWCL,76
79 | AWCR,77
80 | BAGL,78
81 | BAGR,79
82 | BDUL,80
83 | BDUR,81
84 | CEPDL,82
85 | CEPDR,83
86 | CEPVL,84
87 | CEPVR,85
88 | DA1,86
89 | DA2,87
90 | DA3,88
91 | DA4,89
92 | DA5,90
93 | DA6,91
94 | DA7,92
95 | DA8,93
96 | DA9,94
97 | DB1,95
98 | DB2,96
99 | DB3,97
100 | DB4,98
101 | DB5,99
102 | DB6,100
103 | DB7,101
104 | DD1,102
105 | DD2,103
106 | DD3,104
107 | DD4,105
108 | DD5,106
109 | DD6,107
110 | DVA,108
111 | DVB,109
112 | DVC,110
113 | FLPL,111
114 | FLPR,112
115 | HSNL,113
116 | HSNR,114
117 | I1L,115
118 | I1R,116
119 | I2L,117
120 | I2R,118
121 | I3,119
122 | I4,120
123 | I5,121
124 | I6,122
125 | IL1DL,123
126 | IL1DR,124
127 | IL1L,125
128 | IL1R,126
129 | IL1VL,127
130 | IL1VR,128
131 | IL2DL,129
132 | IL2DR,130
133 | IL2L,131
134 | IL2R,132
135 | IL2VL,133
136 | IL2VR,134
137 | LUAL,135
138 | LUAR,136
139 | M1,137
140 | M2L,138
141 | M2R,139
142 | M3L,140
143 | M3R,141
144 | M4,142
145 | M5,143
146 | MCL,144
147 | MCR,145
148 | MI,146
149 | NSML,147
150 | NSMR,148
151 | OLLL,149
152 | OLLR,150
153 | OLQDL,151
154 | OLQDR,152
155 | OLQVL,153
156 | OLQVR,154
157 | PDA,155
158 | PDB,156
159 | PDEL,157
160 | PDER,158
161 | PHAL,159
162 | PHAR,160
163 | PHBL,161
164 | PHBR,162
165 | PHCL,163
166 | PHCR,164
167 | PLML,165
168 | PLMR,166
169 | PLNL,167
170 | PLNR,168
171 | PQR,169
172 | PVCL,170
173 | PVCR,171
174 | PVDL,172
175 | PVDR,173
176 | PVM,174
177 | PVNL,175
178 | PVNR,176
179 | PVPL,177
180 | PVPR,178
181 | PVQL,179
182 | PVQR,180
183 | PVR,181
184 | PVT,182
185 | PVWL,183
186 | PVWR,184
187 | RIAL,185
188 | RIAR,186
189 | RIBL,187
190 | RIBR,188
191 | RICL,189
192 | RICR,190
193 | RID,191
194 | RIFL,192
195 | RIFR,193
196 | RIGL,194
197 | RIGR,195
198 | RIH,196
199 | RIML,197
200 | RIMR,198
201 | RIPL,199
202 | RIPR,200
203 | RIR,201
204 | RIS,202
205 | RIVL,203
206 | RIVR,204
207 | RMDDL,205
208 | RMDDR,206
209 | RMDL,207
210 | RMDR,208
211 | RMDVL,209
212 | RMDVR,210
213 | RMED,211
214 | RMEL,212
215 | RMER,213
216 | RMEV,214
217 | RMFL,215
218 | RMFR,216
219 | RMGL,217
220 | RMGR,218
221 | RMHL,219
222 | RMHR,220
223 | SAADL,221
224 | SAADR,222
225 | SAAVL,223
226 | SAAVR,224
227 | SABD,225
228 | SABVL,226
229 | SABVR,227
230 | SDQL,228
231 | SDQR,229
232 | SIADL,230
233 | SIADR,231
234 | SIAVL,232
235 | SIAVR,233
236 | SIBDL,234
237 | SIBDR,235
238 | SIBVL,236
239 | SIBVR,237
240 | SMBDL,238
241 | SMBDR,239
242 | SMBVL,240
243 | SMBVR,241
244 | SMDDL,242
245 | SMDDR,243
246 | SMDVL,244
247 | SMDVR,245
248 | URADL,246
249 | URADR,247
250 | URAVL,248
251 | URAVR,249
252 | URBL,250
253 | URBR,251
254 | URXL,252
255 | URXR,253
256 | URYDL,254
257 | URYDR,255
258 | URYVL,256
259 | URYVR,257
260 | VA1,258
261 | VA10,259
262 | VA11,260
263 | VA12,261
264 | VA2,262
265 | VA3,263
266 | VA4,264
267 | VA5,265
268 | VA6,266
269 | VA7,267
270 | VA8,268
271 | VA9,269
272 | VB1,270
273 | VB10,271
274 | VB11,272
275 | VB2,273
276 | VB3,274
277 | VB4,275
278 | VB5,276
279 | VB6,277
280 | VB7,278
281 | VB8,279
282 | VB9,280
283 | VC1,281
284 | VC2,282
285 | VC3,283
286 | VC4,284
287 | VC5,285
288 | VC6,286
289 | VD1,287
290 | VD10,288
291 | VD11,289
292 | VD12,290
293 | VD13,291
294 | VD2,292
295 | VD3,293
296 | VD4,294
297 | VD5,295
298 | VD6,296
299 | VD7,297
300 | VD8,298
301 | VD9,299
302 | MDL01,300
303 | MDL02,301
304 | MDL03,302
305 | MDL04,303
306 | MDL05,304
307 | MDL06,305
308 | MDL07,306
309 | MDL08,307
310 | MDL09,308
311 | MDL10,309
312 | MDL11,310
313 | MDL12,311
314 | MDL13,312
315 | MDL14,313
316 | MDL15,314
317 | MDL16,315
318 | MDL17,316
319 | MDL18,317
320 | MDL19,318
321 | MDL20,319
322 | MDL21,320
323 | MDL22,321
324 | MDL23,322
325 | MDL24,323
326 | MVL01,324
327 | MVL02,325
328 | MVL03,326
329 | MVL04,327
330 | MVL05,328
331 | MVL06,329
332 | MVL07,330
333 | MVL08,331
334 | MVL09,332
335 | MVL10,333
336 | MVL11,334
337 | MVL12,335
338 | MVL13,336
339 | MVL14,337
340 | MVL15,338
341 | MVL16,339
342 | MVL17,340
343 | MVL18,341
344 | MVL19,342
345 | MVL20,343
346 | MVL21,344
347 | MVL22,345
348 | MVL23,346
349 | MDR01,347
350 | MDR02,348
351 | MDR03,349
352 | MDR04,350
353 | MDR05,351
354 | MDR06,352
355 | MDR07,353
356 | MDR08,354
357 | MDR09,355
358 | MDR10,356
359 | MDR11,357
360 | MDR12,358
361 | MDR13,359
362 | MDR14,360
363 | MDR15,361
364 | MDR16,362
365 | MDR17,363
366 | MDR18,364
367 | MDR19,365
368 | MDR20,366
369 | MDR21,367
370 | MDR22,368
371 | MDR23,369
372 | MDR24,370
373 | MVR01,371
374 | MVR02,372
375 | MVR03,373
376 | MVR04,374
377 | MVR05,375
378 | MVR06,376
379 | MVR07,377
380 | MVR08,378
381 | MVR09,379
382 | MVR10,380
383 | MVR11,381
384 | MVR12,382
385 | MVR13,383
386 | MVR14,384
387 | MVR15,385
388 | MVR16,386
389 | MVR17,387
390 | MVR18,388
391 | MVR19,389
392 | MVR20,390
393 | MVR21,391
394 | MVR22,392
395 | MVR23,393
396 | MVR24,394
397 | MANAL,395
398 | MVULVA,396
399 |
--------------------------------------------------------------------------------
/src/Celegans.c:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2015 Carlo Meroni
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
23 | ================================================================= */
24 |
25 | ////////////////////////////////////////////////////////////
26 | /// INCLUDES
27 | ////////////////////////////////////////////////////////////
28 | #include
29 | #include
30 | #include
31 | #include
32 | #include "Celegans.h"
33 | #include "brain.h"
34 |
35 | unsigned int hash_str(char* str)
36 | {
37 | unsigned int hash = 7;
38 | int len = strlen(str);
39 | for (int i = 0; i < len; i++)
40 | hash = hash * 31 + str[i];
41 | return hash;
42 | }
43 |
44 | #define HASH_TABLE_SIZE 1024
45 | typedef struct hash_table
46 | {
47 | int size;
48 | int count;
49 | char** keys;
50 | int* values;
51 | } hash_table;
52 |
53 | hash_table* hash_table_init(int size)
54 | {
55 | hash_table* ht = (hash_table*)malloc(sizeof(hash_table));
56 | ht->size = size;
57 | ht->count = 0;
58 | ht->keys = (char**)malloc(sizeof(char*) * size);
59 | for (int i = 0; i < ht->size; i++)
60 | ht->keys[i] = NULL;
61 | ht->values = (int*)malloc(sizeof(int) * size);
62 | return ht;
63 | }
64 |
65 | void hash_table_free(hash_table* ht)
66 | {
67 | for (int i = 0; i < ht->size; i++)
68 | if (ht->keys[i] != NULL)
69 | free(ht->keys[i]);
70 | free(ht->keys);
71 | free(ht->values);
72 | free(ht);
73 | }
74 |
75 | void hash_table_insert(hash_table* ht, char* key, int value)
76 | {
77 | if (!ht || !key) {
78 | printf("Hash table or key is NULL!\n");
79 | return;
80 | }
81 |
82 | int start_index = hash_str(key) % ht->size;
83 | int index = start_index;
84 | while (ht->keys[index] != NULL)
85 | {
86 | if (strcmp(ht->keys[index], key) == 0)
87 | {
88 | ht->values[index] = value;
89 | return;
90 | }
91 |
92 | index = (index + 1) % ht->size;
93 |
94 | if (index == start_index) {
95 | printf("Hash table is full!\n");
96 | return;
97 | }
98 | }
99 |
100 | char* key_copy = strdup(key);
101 | if (!key_copy) {
102 | printf("Failed to allocate memory for key!\n");
103 | return;
104 | }
105 |
106 | ht->keys[index] = key_copy;
107 | ht->values[index] = value;
108 | ht->count++;
109 |
110 | if (ht->count > ht->size) {
111 | printf("Hash table count exceeded the size!\n");
112 | return;
113 | }
114 | }
115 |
116 | int hash_table_get(hash_table* ht, char* key)
117 | {
118 | int start_index = hash_str(key) % ht->size;
119 | int index = start_index;
120 | while (ht->keys[index] != NULL)
121 | {
122 | if (strcmp(ht->keys[index], key) == 0)
123 | return ht->values[index];
124 | index = (index + 1) % ht->size;
125 |
126 | if (index == start_index)
127 | return -1;
128 | }
129 | return -1;
130 | }
131 |
132 | typedef struct NodeId {
133 | char* name;
134 | int id;
135 | } NodeId;
136 | NodeId node_ids[500];
137 | int node_ids_count = 0;
138 |
139 | typedef struct NodeConnection {
140 | char* from;
141 | char* to;
142 | int weight;
143 | } NodeConnection;
144 | NodeConnection connections[1024 * 10];
145 | int connections_count = 0;
146 | hash_table* node_ids_ht = NULL;
147 |
148 | void parse_node_ids(char* filepath) {
149 | // Read CSV file
150 | FILE* file = fopen(filepath, "r");
151 | if (file == NULL) {
152 | printf("Error opening file %s\n", filepath);
153 | exit(1);
154 | }
155 | char line[1024];
156 | node_ids_count = 0;
157 | fgets(line, 1024, file); // skip first line
158 | while (fgets(line, 1024, file)) {
159 | char* tmp = strdup(line);
160 | char* name = strsep(&tmp, ",");
161 | char* id = strsep(&tmp, ",");
162 |
163 | assert(strlen(name) >= 1);
164 | assert(strlen(id) >= 1);
165 | node_ids[node_ids_count].name = strdup(name);
166 | node_ids[node_ids_count].id = atoi(id);
167 | node_ids_count++;
168 | assert(node_ids_count < 500);
169 | }
170 | fclose(file);
171 | }
172 |
173 | void parse_connections(const char* filepath)
174 | {
175 | // Read CSV file
176 | FILE* file = fopen(filepath, "r");
177 | if (file == NULL) {
178 | printf("Error opening file %s\n", filepath);
179 | exit(1);
180 | }
181 | char line[1024];
182 | connections_count = 0;
183 | fgets(line, 1024, file); // skip first line
184 | while (fgets(line, 1024, file)) {
185 | char* tmp = strdup(line);
186 | char* from = strsep(&tmp, ",");
187 | char* to = strsep(&tmp, ",");
188 | char* weight = strsep(&tmp, ",");
189 | connections[connections_count].from = strdup(from);
190 | connections[connections_count].to = strdup(to);
191 | connections[connections_count].weight = atoi(weight);
192 | connections_count++;
193 | assert(connections_count < 1024 * 10);
194 | }
195 | }
196 |
197 |
198 | ////////////////////////////////////////////////////////////
199 | brain* Celegans_brain_init()
200 | {
201 | // Load connectome data
202 | printf("Loading connectome data\n");
203 | parse_node_ids("./connectome/NodesIds.csv");
204 | printf("Loaded %d node ids\n", node_ids_count);
205 | parse_connections("./connectome/CElegansConnectome.csv");
206 | printf("Loaded %d nodes and %d connections\n", node_ids_count, connections_count);
207 |
208 | // map node names to ids
209 | if (node_ids_ht != NULL)
210 | hash_table_free(node_ids_ht);
211 | printf("Mapping node names to ids\n");
212 | node_ids_ht = hash_table_init(BRAIN_SIZE * 4);
213 | for (int i = 0; i < node_ids_count; i++) {
214 | long id = (int)node_ids[i].id;
215 | hash_table_insert(node_ids_ht, node_ids[i].name, id);
216 | }
217 | printf("node_ids_ht->count = %d\n", node_ids_ht->count);
218 | printf("Mapped node names to ids\n");
219 |
220 | // Wire up neurons
221 | printf("Wiring up neurons\n");
222 | brain* b = brain_init();
223 | brain_makeneurons(b, BRAIN_SIZE);
224 | printf("Created %d neurons\n", BRAIN_SIZE);
225 | for (int i = 0; i < connections_count; i++) {
226 | int from_id = hash_table_get(node_ids_ht, connections[i].from);
227 | int to_id = hash_table_get(node_ids_ht, connections[i].to);
228 | if (from_id == -1 || to_id == -1) {
229 | printf("Failed to find node id for %s or %s\n", connections[i].from, connections[i].to);
230 | }
231 | assert(from_id != -1);
232 | assert(to_id != -1);
233 | neuron_link(b->neurons[from_id], b->neurons[to_id], connections[i].weight);
234 | }
235 | printf("Wired up neurons\n");
236 |
237 | return b;
238 | }
239 |
240 | ////////////////////////////////////////////////////////////
241 | void Celegans_brain_free(brain* b)
242 | {
243 | brain_free(b);
244 | if (node_ids_ht != NULL)
245 | hash_table_free(node_ids_ht);
246 | }
247 |
248 | ////////////////////////////////////////////////////////////
249 | void Celegans_brain_update(brain* b)
250 | {
251 | brain_update(b);
252 | }
253 |
254 | ////////////////////////////////////////////////////////////
255 | void Celegans_brain_fire(brain* b, int neuron_id)
256 | {
257 | neuron_fire(b->neurons[neuron_id]);
258 | }
259 |
260 | ////////////////////////////////////////////////////////////
261 | int Celegans_brain_fired(brain* b, int neuron_id)
262 | {
263 | return neuron_fired(b->neurons[neuron_id]);
264 | }
265 |
266 | int Celegans_neuron_get_id(char* name)
267 | {
268 | return (int)hash_table_get(node_ids_ht, name);
269 | }
270 |
271 | ////////////////////////////////////////////////////////////
272 | void Celegans_brain_givefood(brain* b)
273 | {
274 | neuron_fire(b->neurons[Celegans_neuron_get_id("ADFL")]);
275 | neuron_fire(b->neurons[Celegans_neuron_get_id("ADFR")]);
276 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASGR")]);
277 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASGL")]);
278 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASIL")]);
279 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASIR")]);
280 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASJR")]);
281 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASJL")]);
282 | neuron_fire(b->neurons[Celegans_neuron_get_id("AWCL")]);
283 | neuron_fire(b->neurons[Celegans_neuron_get_id("AWCR")]);
284 | neuron_fire(b->neurons[Celegans_neuron_get_id("AWAL")]);
285 | neuron_fire(b->neurons[Celegans_neuron_get_id("AWAR")]);
286 | }
287 |
288 | ////////////////////////////////////////////////////////////
289 | void Celegans_brain_touchnose(brain* b)
290 | {
291 | neuron_fire(b->neurons[Celegans_neuron_get_id("FLPR")]);
292 | neuron_fire(b->neurons[Celegans_neuron_get_id("FLPL")]);
293 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASHL")]);
294 | neuron_fire(b->neurons[Celegans_neuron_get_id("ASHR")]);
295 | neuron_fire(b->neurons[Celegans_neuron_get_id("IL1VL")]);
296 | neuron_fire(b->neurons[Celegans_neuron_get_id("IL1VR")]);
297 | neuron_fire(b->neurons[Celegans_neuron_get_id("OLQDL")]);
298 | neuron_fire(b->neurons[Celegans_neuron_get_id("OLQDR")]);
299 | neuron_fire(b->neurons[Celegans_neuron_get_id("OLQVR")]);
300 | neuron_fire(b->neurons[Celegans_neuron_get_id("OLQVL")]);
301 | }
302 |
303 | ////////////////////////////////////////////////////////////
304 | void Celegans_brain_touchanterior(brain* b)
305 | {
306 | neuron_fire(b->neurons[Celegans_neuron_get_id("FLPL")]);
307 | neuron_fire(b->neurons[Celegans_neuron_get_id("FLPR")]);
308 | neuron_fire(b->neurons[Celegans_neuron_get_id("BDUL")]);
309 | neuron_fire(b->neurons[Celegans_neuron_get_id("BDUR")]);
310 | neuron_fire(b->neurons[Celegans_neuron_get_id("SDQR")]);
311 | }
312 |
313 | ////////////////////////////////////////////////////////////
314 | void Celegans_brain_touchposterior(brain* b)
315 | {
316 | neuron_fire(b->neurons[Celegans_neuron_get_id("PVDL")]);
317 | neuron_fire(b->neurons[Celegans_neuron_get_id("PVDR")]);
318 | neuron_fire(b->neurons[Celegans_neuron_get_id("PVCL")]);
319 | neuron_fire(b->neurons[Celegans_neuron_get_id("PVCR")]);
320 | }
321 |
--------------------------------------------------------------------------------
/src/Celegans.h:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2015 Carlo Meroni
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | ================================================================= */
22 |
23 | ////////////////////////////////////////////////////////////
24 | /// HEADER
25 | ////////////////////////////////////////////////////////////
26 | #ifndef C_ELEGANS_H
27 | #define C_ELEGANS_H
28 |
29 | #define BRAIN_SIZE 397
30 | #define NEURON_START 0
31 | #define NEURON_END 300
32 | #define MUSCLE_LEFT_START 300
33 | #define MUSCLE_LEFT_END 347
34 | #define MUSCLE_RIGHT_START 347
35 | #define MUSCLE_RIGHT_END 395
36 |
37 | //Brain forward declaration
38 | typedef struct brain brain;
39 |
40 | ////////////////////////////////////////////////////////////
41 | /// \brief Create a C. elegans brain
42 | ///
43 | ////////////////////////////////////////////////////////////
44 | extern brain* Celegans_brain_init();
45 |
46 | ////////////////////////////////////////////////////////////
47 | /// \brief Destroy a C. elegans brain
48 | ///
49 | ////////////////////////////////////////////////////////////
50 | extern void Celegans_brain_free(brain* b);
51 |
52 | ////////////////////////////////////////////////////////////
53 | /// \brief Update the brain states
54 | ///
55 | ////////////////////////////////////////////////////////////
56 | extern void Celegans_brain_update(brain* b);
57 |
58 | ////////////////////////////////////////////////////////////
59 | /// \brief Tell a neuron to fire by passing the neuron id
60 | ///
61 | ////////////////////////////////////////////////////////////
62 | extern void Celegans_brain_fire(brain* b, int neuron_id);
63 |
64 | ////////////////////////////////////////////////////////////
65 | /// \brief Check if a neuron have just fired
66 | ///
67 | ////////////////////////////////////////////////////////////
68 | extern int Celegans_brain_fired(brain* b, int neuron_id);
69 |
70 | ////////////////////////////////////////////////////////////
71 | /// \brief Get the neuron id from the neuron name
72 | ///
73 | ////////////////////////////////////////////////////////////
74 | extern int Celegans_neuron_get_id(char* name);
75 |
76 | ////////////////////////////////////////////////////////////
77 | /// \brief Give food
78 | ///
79 | ////////////////////////////////////////////////////////////
80 | extern void Celegans_brain_givefood(brain* b);
81 |
82 | ////////////////////////////////////////////////////////////
83 | /// \brief Touch the worm nose
84 | ///
85 | ////////////////////////////////////////////////////////////
86 | extern void Celegans_brain_touchnose(brain* b);
87 |
88 | ////////////////////////////////////////////////////////////
89 | /// \brief Anterior touch
90 | ///
91 | ////////////////////////////////////////////////////////////
92 | extern void Celegans_brain_touchanterior(brain* b);
93 |
94 | ////////////////////////////////////////////////////////////
95 | /// \brief Posterior touch
96 | ///
97 | ////////////////////////////////////////////////////////////
98 | extern void Celegans_brain_touchposterior(brain* b);
99 |
100 | #endif //C_ELEGANS_H
101 |
--------------------------------------------------------------------------------
/src/VSGraphics.h:
--------------------------------------------------------------------------------
1 | //=======================================================================================
2 | // VIRUAL SHOCK ENGINE
3 | //=======================================================================================
4 | //
5 | // Copyright (c) 2013-2015 Carlo Meroni
6 | //
7 | // This software is provided 'as-is', without any express or implied warranty.
8 | // In no event will the authors be held liable for any damages arising from
9 | // the use of this software.
10 | //
11 | // Permission is granted to anyone to use this software for any purpose,
12 | // including commercial applications, and to alter it and redistribute it freely,
13 | // subject to the following restrictions:
14 | //
15 | // 1. The origin of this software must not be misrepresented;
16 | // you must not claim that you wrote the original software.
17 | // If you use this software in a product, an acknowledgment
18 | // in the product documentation would be appreciated but is
19 | // not required.
20 | //
21 | // 2. Altered source versions must be plainly marked as such,
22 | // and must not be misrepresented as being the original software.
23 | //
24 | // 3. This notice may not be removed or altered from any source
25 | // distribution.
26 | //=======================================================================================
27 |
28 | ////////////////////////////////////////////////////////////
29 | /// HEADER
30 | ////////////////////////////////////////////////////////////
31 | #ifndef VS_GRAPHICS_H
32 | #define VS_GRAPHICS_H
33 |
34 | #ifdef __cplusplus
35 | extern "C" {
36 | #endif
37 |
38 | // ================================
39 | // ====>> OS
40 | // ================================
41 |
42 | // Identify the operating system
43 | #if defined(_WIN32)
44 | //Windows
45 | #define VS_SYS_WINDOWS
46 | #elif defined(__APPLE__)
47 | #include "TargetConditionals.h"
48 | #if TARGET_IPHONE_SIMULATOR
49 | // iOS Simulator
50 | #define VS_SYS_IOS
51 | #elif TARGET_OS_IPHONE
52 | // iOS device
53 | #define VS_SYS_IOS
54 | #elif TARGET_OS_MAC
55 | //Mac
56 | #define VS_SYS_MAC
57 | #else
58 | //Error
59 | #error This operating system is not supported!
60 | #endif
61 |
62 | #elif defined(__linux__)
63 | //Linux
64 | #define VS_SYS_LINUX
65 | #else
66 | //Other systems
67 | #error This operating system is not supported!
68 | #endif
69 |
70 | //Define import / export macros
71 | #if defined(VS_SYS_WINDOWS)
72 |
73 | #if defined(VSGRAPHICS_EXPORTS)
74 | #define VSGRAPHICS_API __declspec(dllexport)
75 | #else
76 | #define VSGRAPHICS_API __declspec(dllimport)
77 | #endif
78 |
79 | #else
80 |
81 | #define VSGRAPHICS_API
82 |
83 | #endif
84 |
85 |
86 |
87 |
88 | // ================================
89 | // ====>> MODULE MANAGER
90 | // ================================
91 |
92 | /*
93 |
94 | Modules:
95 | VECTOR2
96 | RECT
97 | COLOR
98 | GRAPHICS
99 | VIEW
100 | BITMAP
101 | TEXTURE
102 | SHADER
103 | SPRITE
104 | FONT
105 | TEXT
106 | RENDERER
107 |
108 | By default all moudules are exported.
109 | To export only one specific module, you should
110 | define VS_ONLY_$MODULE before including this file.
111 |
112 | Example:
113 | #define VS_ONLY_TEXTURE
114 | #include "VSGraphics.h"
115 |
116 | You can pick also multiple specific modules.
117 |
118 | Example:
119 | #define VS_ONLY_TEXTURE
120 | #define VS_ONLY_VIEW
121 | #define VS_ONLY_RENDERER
122 | #include "VSGraphics.h"
123 |
124 | If you want just the OS defines you should
125 | define VS_NO_EXPORT before including this file
126 |
127 | */
128 |
129 | #if defined(VS_ONLY_VECTOR2) || defined(VS_ONLY_RECT) || defined(VS_ONLY_COLOR)||\
130 | defined(VS_ONLY_GRAPHICS) || defined(VS_ONLY_VIEW) || defined(VS_ONLY_BITMAP) ||\
131 | defined(VS_ONLY_TEXTURE) || defined(VS_ONLY_SHADER) || defined(VS_ONLY_SPRITE) ||\
132 | defined(VS_ONLY_FONT) || defined(VS_ONLY_TEXT) || defined(VS_ONLY_RENDERER)
133 |
134 | #ifdef VS_ONLY_VECTOR2
135 | #define VS_EXPORT_VECTOR2
136 | #endif
137 |
138 | #ifdef VS_ONLY_RECT
139 | #define VS_EXPORT_RECT
140 | #endif
141 |
142 | #ifdef VS_ONLY_COLOR
143 | #define VS_EXPORT_COLOR
144 | #endif
145 |
146 | #ifdef VS_ONLY_GRAPHICS
147 | #define VS_EXPORT_GRAPHICS
148 | #endif
149 |
150 | #ifdef VS_ONLY_VIEW
151 | #define VS_EXPORT_RECT
152 | #define VS_EXPORT_VIEW
153 | #endif
154 |
155 | #ifdef VS_ONLY_BITMAP
156 | #define VS_EXPORT_BITMAP
157 | #endif
158 |
159 | #ifdef VS_ONLY_TEXTURE
160 | #define VS_EXPORT_VECTOR2
161 | #define VS_EXPORT_TEXTURE
162 | #define VS_EXPORT_BITMAP
163 | #endif
164 |
165 | #ifdef VS_ONLY_SHADER
166 | #define VS_EXPORT_SHADER
167 | #endif
168 |
169 | #ifdef VS_ONLY_SPRITE
170 | #define VS_EXPORT_SPRITE
171 | #define VS_EXPORT_TEXTURE
172 | #define VS_EXPORT_BITMAP
173 | #endif
174 |
175 | #ifdef VS_ONLY_FONT
176 | #define VS_EXPORT_RECT
177 | #define VS_EXPORT_FONT
178 | #define VS_EXPORT_TEXTURE
179 | #define VS_EXPORT_BITMAP
180 | #endif
181 |
182 | #ifdef VS_ONLY_TEXT
183 | #define VS_EXPORT_FONT
184 | #define VS_EXPORT_TEXT
185 | #endif
186 |
187 | #ifdef VS_ONLY_RENDERER
188 | #define VS_EXPORT_RENDERER
189 | #define VS_EXPORT_SPRITE
190 | #define VS_EXPORT_TEXTURE
191 | #define VS_EXPORT_BITMAP
192 | #endif
193 |
194 | #else
195 |
196 | //Define all modules
197 | #define VS_EXPORT_VECTOR2
198 | #define VS_EXPORT_RECT
199 | #define VS_EXPORT_COLOR
200 | #define VS_EXPORT_GRAPHICS
201 | #define VS_EXPORT_VIEW
202 | #define VS_EXPORT_BITMAP
203 | #define VS_EXPORT_TEXTURE
204 | #define VS_EXPORT_SHADER
205 | #define VS_EXPORT_SPRITE
206 | #define VS_EXPORT_FONT
207 | #define VS_EXPORT_TEXT
208 | #define VS_EXPORT_RENDERER
209 |
210 | #endif
211 |
212 | //Undefine all modules
213 | #if defined(VS_NO_EXPORT)
214 |
215 | #undef VS_EXPORT_VECTOR2
216 | #undef VS_EXPORT_RECT
217 | #undef VS_EXPORT_COLOR
218 | #undef VS_EXPORT_GRAPHICS
219 | #undef VS_EXPORT_VIEW
220 | #undef VS_EXPORT_BITMAP
221 | #undef VS_EXPORT_TEXTURE
222 | #undef VS_EXPORT_SHADER
223 | #undef VS_EXPORT_SPRITE
224 | #undef VS_EXPORT_FONT
225 | #undef VS_EXPORT_TEXT
226 | #undef VS_EXPORT_RENDERER
227 |
228 | #endif
229 |
230 | //For the implementation we need only
231 | //3 modules
232 | #if defined(VS_GRAPHICS_IMPLEMENTATION)
233 |
234 | #define VS_EXPORT_VECTOR2
235 | #define VS_EXPORT_RECT
236 | #define VS_EXPORT_COLOR
237 | #undef VS_EXPORT_GRAPHICS
238 | #undef VS_EXPORT_VIEW
239 | #undef VS_EXPORT_BITMAP
240 | #undef VS_EXPORT_TEXTURE
241 | #undef VS_EXPORT_SHADER
242 | #undef VS_EXPORT_SPRITE
243 | #undef VS_EXPORT_FONT
244 | #undef VS_EXPORT_TEXT
245 | #undef VS_EXPORT_RENDERER
246 |
247 | #endif
248 |
249 |
250 |
251 |
252 | // ================================
253 | // ====>> CONSTANTS
254 | // ================================
255 |
256 | //This macro allow to use fonts
257 | //for text rendering.
258 | //It require the freetype library.
259 | //#define VS_FREETYPE
260 |
261 | //Boolean values
262 | #define VS_FALSE 0
263 | #define VS_TRUE 1
264 |
265 | //Shaders types
266 | #define VS_SHADER_VERTEX 0
267 | #define VS_SHADER_FRAGMENT 1
268 |
269 | //Shader parameters types
270 | #define VS_SHADER_PARAM_UNIFORM 2
271 | #define VS_SHADER_PARAM_ATTRIBUTE 3
272 |
273 | //Font start and end characters
274 | #define VS_FONT_CH_START 32
275 | #define VS_FONT_CH_END 127
276 | #define VS_FONT_CH_COUNT (VS_FONT_CH_END - VS_FONT_CH_START)
277 |
278 | //Text alignment
279 | #define VS_TEXT_ALIGN_LEFT 0
280 | #define VS_TEXT_ALIGN_CENTER 1
281 |
282 | #ifdef VS_EXPORT_VECTOR2
283 |
284 | // ================================
285 | // ====>> VECTOR2
286 | // ================================
287 |
288 | ////////////////////////////////////////////////////////////
289 | /// \brief 2 dimensional vector
290 | ///
291 | ////////////////////////////////////////////////////////////
292 | typedef struct vsVector2 { float x, y; } vsVector2;
293 |
294 | ////////////////////////////////////////////////////////////
295 | /// \brief Create a vector from its base components
296 | ///
297 | ////////////////////////////////////////////////////////////
298 | #define VSVECTOR2(x, y) (vsVector2){x, y}
299 |
300 | #endif // VS_EXPORT_VECTOR2
301 |
302 |
303 |
304 |
305 | #ifdef VS_EXPORT_RECT
306 |
307 | // ================================
308 | // ====>> RECT
309 | // ================================
310 |
311 | ////////////////////////////////////////////////////////////
312 | /// \brief 2 dimensional area
313 | ///
314 | ////////////////////////////////////////////////////////////
315 | typedef struct vsRect { float x, y, w, h; } vsRect;
316 |
317 | ////////////////////////////////////////////////////////////
318 | /// \brief Create a rect from its base components
319 | ///
320 | ////////////////////////////////////////////////////////////
321 | #define VSRECT(x, y, w, h) (vsRect){x, y, w, h}
322 |
323 | #endif // VS_EXPORT_RECT
324 |
325 |
326 |
327 |
328 | #ifdef VS_EXPORT_COLOR
329 |
330 | // ================================
331 | // ====>> COLOR
332 | // ================================
333 |
334 | ///////////////////////////////////////////////////////////
335 | /// \brief RGBA Color
336 | ///
337 | ///////////////////////////////////////////////////////////
338 | typedef struct vsColor { unsigned char r, g, b, a; } vsColor;
339 |
340 | ////////////////////////////////////////////////////////////
341 | /// \brief Create a vector from its base components
342 | ///
343 | ////////////////////////////////////////////////////////////
344 | #define VSCOLOR(r, g, b, a) (vsColor){r, g, b, a}
345 |
346 | #define VS_COLOR_WHITE VSCOLOR( 255, 255, 255, 255 )
347 | #define VS_COLOR_RED VSCOLOR( 255, 0, 0, 255 )
348 | #define VS_COLOR_GREEN VSCOLOR( 0, 255, 0, 255 )
349 | #define VS_COLOR_BLUE VSCOLOR( 0, 0, 255, 255 )
350 | #define VS_COLOR_BLACK VSCOLOR( 0, 0, 0, 255 )
351 |
352 | #endif // VS_EXPORT_COLOR
353 |
354 |
355 |
356 |
357 | #ifdef VS_EXPORT_GRAPHICS
358 |
359 | // ================================
360 | // ====>> VSGRAPHICS
361 | // ================================
362 |
363 | ////////////////////////////////////////////////////////////
364 | /// \brief Initialize the library. Must be called after
365 | /// a opengl context is created
366 | ///
367 | ////////////////////////////////////////////////////////////
368 | VSGRAPHICS_API void vsGraphicsInit();
369 |
370 | ////////////////////////////////////////////////////////////
371 | /// \brief Destroy the library
372 | ///
373 | ////////////////////////////////////////////////////////////
374 | VSGRAPHICS_API void vsGraphicsDestroy();
375 |
376 | #endif // VS_EXPORT_GRAPHICS
377 |
378 |
379 |
380 |
381 | #ifdef VS_EXPORT_VIEW
382 |
383 | // ================================
384 | // ====>> VIEW
385 | // ================================
386 |
387 | ////////////////////////////////////////////////////////////
388 | /// \brief The view allow to controll what part of the
389 | /// virtual space is rendered on the screen
390 | ///
391 | ////////////////////////////////////////////////////////////
392 | typedef struct vsView
393 | {
394 | vsRect viewport;
395 | vsVector2 center;
396 | vsVector2 size;
397 | float rotation;
398 | float matrix[16];
399 | } vsView;
400 |
401 | ////////////////////////////////////////////////////////////
402 | /// \brief Apply view changes
403 | ///
404 | ////////////////////////////////////////////////////////////
405 | VSGRAPHICS_API void vsViewSet(vsView view);
406 |
407 | ////////////////////////////////////////////////////////////
408 | /// \brief Set the specified view as current
409 | ///
410 | ////////////////////////////////////////////////////////////
411 | VSGRAPHICS_API void vsViewCreate(vsRect viewport, vsVector2 center,
412 | vsVector2 size, float angle);
413 |
414 | ////////////////////////////////////////////////////////////
415 | /// \brief Get the view center position in space
416 | ///
417 | ////////////////////////////////////////////////////////////
418 | VSGRAPHICS_API vsVector2 vsViewGetCenter();
419 |
420 | ////////////////////////////////////////////////////////////
421 | /// \brief Get the view size
422 | ///
423 | ////////////////////////////////////////////////////////////
424 | VSGRAPHICS_API vsVector2 vsViewGetSize();
425 |
426 | ////////////////////////////////////////////////////////////
427 | /// \brief Get the view rotation
428 | ///
429 | ////////////////////////////////////////////////////////////
430 | VSGRAPHICS_API float vsViewGetRotation();
431 |
432 | #endif // VS_EXPORT_VIEW
433 |
434 |
435 |
436 |
437 | #ifdef VS_EXPORT_BITMAP
438 |
439 | // ================================
440 | // ====>> BITMAP
441 | // ================================
442 |
443 | ////////////////////////////////////////////////////////////
444 | /// \brief A bitmap defines a display space and the color
445 | /// for each pixel or "bit" in the display space
446 | ///
447 | ////////////////////////////////////////////////////////////
448 | typedef struct vsBitmap vsBitmap;
449 |
450 | ////////////////////////////////////////////////////////////
451 | /// \brief Initialize the bitmap
452 | ///
453 | ////////////////////////////////////////////////////////////
454 | VSGRAPHICS_API vsBitmap* vsBitmapInit();
455 |
456 | ////////////////////////////////////////////////////////////
457 | /// \brief Unload the bitmap
458 | ///
459 | ////////////////////////////////////////////////////////////
460 | VSGRAPHICS_API void vsBitmapUnload(vsBitmap* bitmap);
461 |
462 | ////////////////////////////////////////////////////////////
463 | /// \brief Destroy the bitmap
464 | ///
465 | ////////////////////////////////////////////////////////////
466 | VSGRAPHICS_API void vsBitmapDestroy(vsBitmap* bitmap);
467 |
468 | ////////////////////////////////////////////////////////////
469 | /// \brief Load bitmap from file
470 | ///
471 | ////////////////////////////////////////////////////////////
472 | VSGRAPHICS_API void vsBitmapLoad(vsBitmap* bitmap, const char* filepath);
473 |
474 | ////////////////////////////////////////////////////////////
475 | /// \brief Load bitmap from data
476 | ///
477 | ////////////////////////////////////////////////////////////
478 | VSGRAPHICS_API void vsBitmapLoadFromData(vsBitmap* bitmap, unsigned char* data,
479 | int width, int height, int channels);
480 |
481 | ////////////////////////////////////////////////////////////
482 | /// \brief Get bitmap size
483 | ///
484 | ////////////////////////////////////////////////////////////
485 | VSGRAPHICS_API vsVector2 vsBitmapGetSize(vsBitmap* bitmap);
486 |
487 | ////////////////////////////////////////////////////////////
488 | /// \brief Get bitmap channels
489 | ///
490 | ////////////////////////////////////////////////////////////
491 | VSGRAPHICS_API int vsBitmapGetChannels(vsBitmap* bitmap);
492 |
493 | ////////////////////////////////////////////////////////////
494 | /// \brief Get bitmap data
495 | ///
496 | ////////////////////////////////////////////////////////////
497 | VSGRAPHICS_API const unsigned char* vsBitmapGetData(vsBitmap* bitmap);
498 |
499 | #endif // VS_EXPORT_BITMAP
500 |
501 |
502 |
503 |
504 | #ifdef VS_EXPORT_TEXTURE
505 |
506 | // ================================
507 | // ====>> TEXTURE
508 | // ================================
509 |
510 | ////////////////////////////////////////////////////////////
511 | /// \brief Image living on the graphics card that can be
512 | /// used for drawing
513 | ///
514 | ////////////////////////////////////////////////////////////
515 | typedef struct vsTexture
516 | {
517 | unsigned int id;
518 | vsVector2 size;
519 | int smooth;
520 | int repeated;
521 | } vsTexture;
522 |
523 | ////////////////////////////////////////////////////////////
524 | /// \brief Initialize the texture
525 | ///
526 | ////////////////////////////////////////////////////////////
527 | VSGRAPHICS_API vsTexture* vsTextureInit();
528 |
529 | ////////////////////////////////////////////////////////////
530 | /// \brief Destroy the texture
531 | ///
532 | ////////////////////////////////////////////////////////////
533 | VSGRAPHICS_API void vsTextureDestroy(vsTexture* texture);
534 |
535 | ////////////////////////////////////////////////////////////
536 | /// \brief Load the texture from file
537 | ///
538 | ////////////////////////////////////////////////////////////
539 | VSGRAPHICS_API void vsTextureLoad(vsTexture* texture, const char* filepath);
540 |
541 | ///////////////////////////////////////////////////////////
542 | /// \brief Load the texture from data
543 | ///
544 | ///////////////////////////////////////////////////////////
545 | VSGRAPHICS_API void vsTextureLoadFromData(vsTexture* texture, vsBitmap* bitmap);
546 |
547 | ////////////////////////////////////////////////////////////
548 | /// \brief Unload the texture
549 | ///
550 | ////////////////////////////////////////////////////////////
551 | VSGRAPHICS_API void vsTextureUnload(vsTexture* texture);
552 |
553 | ////////////////////////////////////////////////////////////
554 | /// \brief Enable or disable the smooth filter
555 | ///
556 | ////////////////////////////////////////////////////////////
557 | VSGRAPHICS_API void vsTextureSetSmooth(vsTexture* texture, const int smooth);
558 |
559 | ////////////////////////////////////////////////////////////
560 | /// \brief Enable or disable repeating
561 | ///
562 | ////////////////////////////////////////////////////////////
563 | VSGRAPHICS_API void vsTextureSetRepeated(vsTexture* texture, const int repeated);
564 |
565 | ////////////////////////////////////////////////////////////
566 | /// \brief Get the texture with and height
567 | ///
568 | ////////////////////////////////////////////////////////////
569 | VSGRAPHICS_API vsVector2 vsTextureGetSize(vsTexture* texture);
570 |
571 | ////////////////////////////////////////////////////////////
572 | /// \brief Check if the smooth filter is enabled or not
573 | ///
574 | ////////////////////////////////////////////////////////////
575 | VSGRAPHICS_API int vsTextureIsSmooth(vsTexture* texture);
576 |
577 | ////////////////////////////////////////////////////////////
578 | /// \brief Check if the texture is repeated or not
579 | ///
580 | ////////////////////////////////////////////////////////////
581 | VSGRAPHICS_API int vsTextureIsRepeated(vsTexture* texture);
582 |
583 | #endif // VS_EXPORT_TEXTURE
584 |
585 |
586 |
587 |
588 | #ifdef VS_EXPORT_SHADER
589 |
590 | // ================================
591 | // ====>> SHADER
592 | // ================================
593 |
594 | ////////////////////////////////////////////////////////////
595 | /// \brief Vertex and Fragment shader program
596 | ///
597 | ////////////////////////////////////////////////////////////
598 | typedef struct vsShader vsShader;
599 |
600 | ////////////////////////////////////////////////////////////
601 | /// \brief Initialize the shader
602 | ///
603 | ////////////////////////////////////////////////////////////
604 | VSGRAPHICS_API vsShader* vsShaderInit();
605 |
606 | ////////////////////////////////////////////////////////////
607 | /// \brief Destroy the shader
608 | ///
609 | ////////////////////////////////////////////////////////////
610 | VSGRAPHICS_API void vsShaderDestroy(vsShader* shader);
611 |
612 | ////////////////////////////////////////////////////////////
613 | /// \brief Load shader from file
614 | ///
615 | ////////////////////////////////////////////////////////////
616 | VSGRAPHICS_API void vsShaderLoad(vsShader* shader, const char* filepath, int shadertype);
617 |
618 | ////////////////////////////////////////////////////////////
619 | /// \brief Load shader from file
620 | ///
621 | ////////////////////////////////////////////////////////////
622 | VSGRAPHICS_API void vsShaderLoad2(vsShader* shader, const char* vertexshader_path,
623 | const char* fragmentshader_path);
624 |
625 | ///////////////////////////////////////////////////////////
626 | /// \brief Bind the shader as current
627 | ///
628 | ///////////////////////////////////////////////////////////
629 | VSGRAPHICS_API void vsShaderBind(vsShader* shader);
630 |
631 | ////////////////////////////////////////////////////////////
632 | /// \brief Compile shader from source
633 | ///
634 | ////////////////////////////////////////////////////////////
635 | VSGRAPHICS_API void vsShaderCompile(vsShader* shader, const char* source, int shadertype);
636 |
637 | ////////////////////////////////////////////////////////////
638 | /// \brief Compile shader from source
639 | ///
640 | ////////////////////////////////////////////////////////////
641 | VSGRAPHICS_API void vsShaderCompile2(vsShader* shader, const char* vertexsource,
642 | const char* fragmentsource);
643 |
644 | ////////////////////////////////////////////////////////////
645 | /// \brief Unload the shader
646 | ///
647 | ////////////////////////////////////////////////////////////
648 | VSGRAPHICS_API void vsShaderUnload(vsShader* shader);
649 |
650 | ////////////////////////////////////////////////////////////
651 | /// \brief Get the shader identifier
652 | ///
653 | ////////////////////////////////////////////////////////////
654 | VSGRAPHICS_API unsigned int vsShaderGetID(vsShader* shader);
655 |
656 | ////////////////////////////////////////////////////////////
657 | /// \brief Set shader parameter
658 | ///
659 | ////////////////////////////////////////////////////////////
660 | VSGRAPHICS_API void vsShaderSetParam1(vsShader* shader, const char* paramname, int paramtype,
661 | const float x);
662 |
663 | ////////////////////////////////////////////////////////////
664 | /// \brief Set shader parameters
665 | ///
666 | ////////////////////////////////////////////////////////////
667 | VSGRAPHICS_API void vsShaderSetParam2(vsShader* shader, const char* paramname, int paramtype,
668 | const float x, const float y);
669 |
670 | ////////////////////////////////////////////////////////////
671 | /// \brief Set shader parameters
672 | ///
673 | ////////////////////////////////////////////////////////////
674 | VSGRAPHICS_API void vsShaderSetParam3(vsShader* shader, const char* paramname, int paramtype,
675 | const float x, const float y, const float z);
676 |
677 | ////////////////////////////////////////////////////////////
678 | /// \brief Set shader parameters
679 | ///
680 | ////////////////////////////////////////////////////////////
681 | VSGRAPHICS_API void vsShaderSetParam4(vsShader* shader, const char* paramname, int paramtype,
682 | const float x, const float y, const float z,
683 | const float w);
684 |
685 |
686 | #endif // VS_EXPORT_SHADER
687 |
688 |
689 |
690 |
691 | #ifdef VS_EXPORT_SPRITE
692 |
693 | // ================================
694 | // ====>> SPRITE
695 | // ================================
696 |
697 | typedef struct vsSprite
698 | {
699 | vsTexture* texture;
700 | vsRect texsource;
701 | vsVector2 position;
702 | vsVector2 size;
703 | vsVector2 origin;
704 | float rotation;
705 | vsColor color;
706 | } vsSprite;
707 |
708 | #endif // VS_EXPORT_SPRITE
709 |
710 |
711 |
712 |
713 | #if defined(VS_EXPORT_FONT) && defined(VS_FREETYPE)
714 |
715 | // ================================
716 | // ====>> FONT
717 | // ================================
718 |
719 | typedef struct vsFont
720 | {
721 | vsTexture* texture;
722 | unsigned int ch_height;
723 | unsigned int *ch_widths;
724 | vsRect *texcoords_table;
725 | } vsFont;
726 |
727 | ////////////////////////////////////////////////////////////
728 | /// \brief Initialize font
729 | ///
730 | ////////////////////////////////////////////////////////////
731 | VSGRAPHICS_API vsFont* vsFontInit();
732 |
733 | ////////////////////////////////////////////////////////////
734 | /// \brief Destroy font
735 | ///
736 | ////////////////////////////////////////////////////////////
737 | VSGRAPHICS_API void vsFontDestroy(vsFont* bmf);
738 |
739 | ////////////////////////////////////////////////////////////
740 | /// \brief Load font from file
741 | ///
742 | ///////////////////////////////////////////////////////////int/
743 | VSGRAPHICS_API void vsFontLoad(vsFont* font, const char* filepath, unsigned int size);
744 |
745 | ////////////////////////////////////////////////////////////
746 | /// \brief Get font texture
747 | ///
748 | ////////////////////////////////////////////////////////////
749 | VSGRAPHICS_API vsTexture* vsFontGetTexture(vsFont* font);
750 |
751 | ////////////////////////////////////////////////////////////
752 | /// \brief Get rect texture coordinates of a character
753 | ///
754 | ////////////////////////////////////////////////////////////
755 | VSGRAPHICS_API const vsRect* vsFontGetTexCoord(vsFont* font, const char ch);
756 |
757 | ////////////////////////////////////////////////////////////
758 | /// \brief Get text lenght
759 | ///
760 | ////////////////////////////////////////////////////////////
761 | VSGRAPHICS_API unsigned int vsFontGetLenght(vsFont* font, const char* text, float scalex);
762 |
763 | #endif // VS_EXPORT_FONT
764 |
765 |
766 |
767 |
768 | #if defined(VS_EXPORT_TEXT) && defined(VS_FREETYPE)
769 |
770 | // ================================
771 | // ====>> TEXT
772 | // ================================
773 |
774 | typedef struct vsText
775 | {
776 | vsFont* font;
777 | char* text;
778 | vsVector2 pos;
779 | vsVector2 scale;
780 | unsigned int alignment;
781 | vsColor color;
782 | } vsText;
783 |
784 | #endif
785 |
786 |
787 |
788 |
789 | #ifdef VS_EXPORT_RENDERER
790 |
791 | // ================================
792 | // ====>> RENDERER
793 | // ================================
794 |
795 | ////////////////////////////////////////////////////////////
796 | /// \brief Clear the screen
797 | ///
798 | ////////////////////////////////////////////////////////////
799 | VSGRAPHICS_API void vsRendererClear();
800 |
801 | ////////////////////////////////////////////////////////////
802 | /// \brief Draw on the screen things that are in queue
803 | ///
804 | ////////////////////////////////////////////////////////////
805 | VSGRAPHICS_API void vsRendererDisplay();
806 |
807 | ////////////////////////////////////////////////////////////
808 | /// \brief Draw a sprite on the screen
809 | ///
810 | ////////////////////////////////////////////////////////////
811 | VSGRAPHICS_API void vsRendererDrawSprite(vsSprite* sprite);
812 |
813 | ////////////////////////////////////////////////////////////
814 | /// \brief Draw a quad on the screen
815 | ///
816 | ////////////////////////////////////////////////////////////
817 | VSGRAPHICS_API void vsRendererDrawRect(vsTexture* texture, float tx, float ty, float tw, float th,
818 | float x, float y, float w, float h, vsColor color);
819 |
820 | #if defined(VS_FREETYPE)
821 |
822 | ////////////////////////////////////////////////////////////
823 | /// \brief Draw text on the screen
824 | ///
825 | ////////////////////////////////////////////////////////////
826 | VSGRAPHICS_API void vsRendererDrawTextRaw(vsFont* font, const char* text, float x, float y,
827 | float scalex, float scaley, unsigned int alignment,
828 | vsColor color);
829 |
830 | ////////////////////////////////////////////////////////////
831 | /// \brief Draw text on the screen
832 | ///
833 | ////////////////////////////////////////////////////////////
834 | VSGRAPHICS_API void vsRendererDrawText(vsText* text);
835 |
836 | #endif
837 |
838 | ////////////////////////////////////////////////////////////
839 | /// \brief Enable/Disable wireframe
840 | ///
841 | ////////////////////////////////////////////////////////////
842 | VSGRAPHICS_API void vsRendererToggleWireFrame();
843 |
844 | #endif // VS_EXPORT_RENDERER
845 |
846 | #ifdef __cplusplus
847 | } // extern C
848 | #endif
849 |
850 | #endif // VS_GRAPHICS_H
851 |
852 |
853 |
854 | ////////////////////////////////////////////////////////////
855 | /// IMPLEMENTATION
856 | ////////////////////////////////////////////////////////////
857 | #ifdef VS_GRAPHICS_IMPLEMENTATION
858 |
859 | #include
860 | #include
861 | #include
862 | #include
863 |
864 | #define STBI_NO_PSD
865 | #define STBI_NO_GIF
866 | #define STBI_NO_HDR
867 | #define STBI_NO_PIC
868 | #define STBI_NO_PNM
869 | #define STB_IMAGE_IMPLEMENTATION
870 | #include "stb_image.h"
871 |
872 | #if defined(VS_FREETYPE)
873 | #include
874 | #include FT_FREETYPE_H
875 | #endif
876 |
877 | #if defined(VS_SYS_LINUX)
878 | #define GL_GLEXT_PROTOTYPES
879 | #include
880 | #include
881 | #elif defined(VS_SYS_MAC)
882 | #include
883 | #elif defined(VS_SYS_IOS)
884 | #include
885 | #elif defined(VS_SYS_WINDOWS)
886 | #include
887 | #endif
888 |
889 |
890 |
891 |
892 | // ================================
893 | // ====>> STRUCTURES
894 | // ================================
895 |
896 | ////////////////////////////////////////////////////////////
897 | typedef struct vsGLState
898 | {
899 | unsigned int currentTexture;
900 | unsigned int currentShader;
901 | unsigned int currentArrayBuffer;
902 | } vsGLState;
903 |
904 | ////////////////////////////////////////////////////////////
905 | typedef struct vsView
906 | {
907 | vsRect viewport;
908 | vsVector2 center;
909 | vsVector2 size;
910 | float rotation;
911 | float matrix[16];
912 | } vsView;
913 |
914 | ////////////////////////////////////////////////////////////
915 | typedef struct vsBitmap
916 | {
917 | unsigned char* data;
918 | int width, height;
919 | int channels;
920 | } vsBitmap;
921 |
922 | ////////////////////////////////////////////////////////////
923 | typedef struct vsTexture
924 | {
925 | unsigned int id;
926 | vsVector2 size;
927 | int smooth;
928 | int repeated;
929 | } vsTexture;
930 |
931 | ////////////////////////////////////////////////////////////
932 | typedef struct vsShader
933 | {
934 | unsigned int id;
935 | const char** paramnames;
936 | int* parampos;
937 | int paramcount;
938 | int paramcapacity;
939 | } vsShader;
940 |
941 | ////////////////////////////////////////////////////////////
942 | typedef struct vsSprite
943 | {
944 | vsTexture* texture;
945 | vsRect texsource;
946 | vsVector2 position;
947 | vsVector2 size;
948 | vsVector2 origin;
949 | float rotation;
950 | vsColor color;
951 | } vsSprite;
952 |
953 | ////////////////////////////////////////////////////////////
954 | typedef struct vsFont
955 | {
956 | vsTexture* texture;
957 | unsigned int ch_height;
958 | unsigned int *ch_widths;
959 | vsRect *texcoords_table;
960 | } vsFont;
961 |
962 | ////////////////////////////////////////////////////////////
963 | typedef struct vsText
964 | {
965 | vsFont* font;
966 | char* text;
967 | vsVector2 pos;
968 | vsVector2 scale;
969 | unsigned int alignment;
970 | vsColor color;
971 | } vsText;
972 |
973 | ////////////////////////////////////////////////////////////
974 | typedef struct vsRenderer
975 | {
976 | float vertexbuf[1024][2];
977 | float texsourcebuf[1024][2];
978 | unsigned char colorbuf[1024][4];
979 | unsigned int ibo;
980 | int buffersize;
981 | int countverts;
982 | int wireframe;
983 | } vsRenderer;
984 |
985 | static vsGLState glstate;
986 | static vsView currentView;
987 | static vsRenderer renderer;
988 |
989 | #if defined(VS_FREETYPE)
990 | static FT_Library ftlib;
991 | #endif
992 |
993 |
994 |
995 | // ================================
996 | // ====>> GLSTATE
997 | // ================================
998 |
999 | ////////////////////////////////////////////////////////////
1000 | void vsGLStateBindTexture(unsigned int id)
1001 | {
1002 | if (glstate.currentTexture == id) return;
1003 | glBindTexture(GL_TEXTURE_2D, id);
1004 | glstate.currentTexture = id;
1005 | }
1006 |
1007 | ////////////////////////////////////////////////////////////
1008 | void vsGLStateBindShader(unsigned int id)
1009 | {
1010 | #if !defined(VS_SYS_IOS)
1011 | if (glstate.currentShader == id) return;
1012 | glUseProgram(id);
1013 | glstate.currentShader = id;
1014 | #endif
1015 | }
1016 |
1017 | ////////////////////////////////////////////////////////////
1018 | void vsGLStateBindBuffer(unsigned int id, unsigned int type)
1019 | {
1020 | if (glstate.currentArrayBuffer == id) return;
1021 | glBindBuffer(type, id);
1022 | glstate.currentArrayBuffer = id;
1023 | }
1024 |
1025 | ////////////////////////////////////////////////////////////
1026 | void vsGLStateReset()
1027 | {
1028 | vsGLStateBindTexture(0);
1029 | vsGLStateBindShader(0);
1030 | vsGLStateBindBuffer(0, GL_ARRAY_BUFFER);
1031 | }
1032 |
1033 |
1034 |
1035 |
1036 |
1037 | // ================================
1038 | // ====>> VSGRAPHICS
1039 | // ================================
1040 |
1041 | ////////////////////////////////////////////////////////////
1042 | void vsGraphicsInit()
1043 | {
1044 | //Clear
1045 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1046 | glClearColor(0, 0, 0, 0);
1047 |
1048 | //Init opengl
1049 | //Enable textures
1050 | glEnable(GL_TEXTURE_2D);
1051 |
1052 | //Enable Alpha
1053 | glEnable(GL_BLEND);
1054 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1055 |
1056 | //Enable vertex array
1057 | glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1058 | glEnableClientState(GL_VERTEX_ARRAY);
1059 | glEnableClientState(GL_COLOR_ARRAY);
1060 |
1061 | //Reset glstate
1062 | vsGLStateReset();
1063 |
1064 | //Setup renderer
1065 | renderer.buffersize = 0;
1066 | renderer.countverts = 0;
1067 | renderer.wireframe = 0;
1068 |
1069 | //Generate indices buffer object
1070 | glGenBuffers(1, &renderer.ibo);
1071 |
1072 | //Calculate indices data
1073 | const int buffersize = 1536;
1074 | unsigned short indsbuf[buffersize];
1075 | unsigned short ind = 0;
1076 | int i;
1077 | for (i = 0; i < buffersize - 5; i+=6)
1078 | {
1079 | indsbuf[i] = ind;
1080 | indsbuf[i + 1] = ind + 1;
1081 | indsbuf[i + 2] = ind + 2;
1082 | indsbuf[i + 3] = ind + 2;
1083 | indsbuf[i + 4] = ind + 3;
1084 | indsbuf[i + 5] = ind;
1085 | ind += 4;
1086 | }
1087 |
1088 | //Send indices data to the graphics card
1089 | vsGLStateBindBuffer(renderer.ibo, GL_ELEMENT_ARRAY_BUFFER);
1090 | glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short) * buffersize,
1091 | indsbuf, GL_STATIC_DRAW);
1092 |
1093 | //We don't need ArrayBuffer
1094 | vsGLStateBindBuffer(0, GL_ARRAY_BUFFER);
1095 |
1096 | //Initialize freetype
1097 | #if defined(VS_FREETYPE)
1098 | if (FT_Init_FreeType(&ftlib)) {
1099 | printf("Error: can't initialize the freetype library\n");
1100 | return;
1101 | }
1102 | #endif
1103 | }
1104 |
1105 | ////////////////////////////////////////////////////////////
1106 | void vsGraphicsDestroy()
1107 | {
1108 | //Disable opengl stuff
1109 | glDisable(GL_TEXTURE_2D);
1110 | glDisable(GL_BLEND);
1111 | glDisableClientState(GL_TEXTURE_COORD_ARRAY);
1112 | glDisableClientState(GL_VERTEX_ARRAY);
1113 | glDisableClientState(GL_COLOR_ARRAY);
1114 |
1115 | //Delete indices buffer object
1116 | vsGLStateBindBuffer(renderer.ibo, GL_ELEMENT_ARRAY_BUFFER);
1117 | glDeleteBuffers(1, &renderer.ibo);
1118 |
1119 | //Destroy freetype
1120 | #if defined(VS_FREETYPE)
1121 | FT_Done_FreeType(ftlib);
1122 | #endif
1123 | }
1124 |
1125 |
1126 |
1127 |
1128 | // ================================
1129 | // ====>> VIEW
1130 | // ================================
1131 |
1132 |
1133 | ////////////////////////////////////////////////////////////
1134 | void vsViewSet(vsView view)
1135 | {
1136 | vsVector2 NCenter;
1137 | NCenter.x = floor(view.center.x);
1138 | NCenter.y = floor(view.center.y);
1139 |
1140 | // Rotation components
1141 | float angle = view.rotation * 3.141592654f / 180.f;
1142 | float cosine = cosf(angle);
1143 | float sine = sinf(angle);
1144 | float tx = -NCenter.x * cosine - NCenter.y * sine + NCenter.x;
1145 | float ty = NCenter.x * sine - NCenter.y * cosine + NCenter.y;
1146 |
1147 | // Projection components
1148 | float a = 2.f / view.size.x;
1149 | float b = -2.f / view.size.y;
1150 | float c = -a * NCenter.x;
1151 | float d = -b * NCenter.y;
1152 |
1153 | const float zNear = 0;
1154 | const float zFar = 10;
1155 | const float e = 2.f / (zFar - zNear);
1156 | const float f = -(zFar + zNear) / (zFar - zNear);
1157 |
1158 | //Update matrix
1159 | view.matrix[0] = a * cosine;
1160 | view.matrix[1] = -b * sine;
1161 | view.matrix[2] = 0.f;
1162 | view.matrix[3] = 0.f;
1163 | view.matrix[4] = a * sine;
1164 | view.matrix[5] = b * cosine;
1165 | view.matrix[6] = 0.f;
1166 | view.matrix[7] = 0.f;
1167 | view.matrix[8] = 0.f;
1168 | view.matrix[9] = 0.f;
1169 | view.matrix[10] = e;
1170 | view.matrix[11] = 0.f;
1171 | view.matrix[12] = a * tx + c;
1172 | view.matrix[13] = b * ty + d;
1173 | view.matrix[14] = f;
1174 | view.matrix[15] = 1.f;
1175 |
1176 | //Update view
1177 | currentView = view;
1178 |
1179 | //Set viewport
1180 | glViewport(view.viewport.x, view.viewport.y, view.viewport.w, view.viewport.h);
1181 |
1182 | //Apply view
1183 | glMatrixMode(GL_PROJECTION);
1184 | glLoadMatrixf(view.matrix);
1185 | glMatrixMode(GL_MODELVIEW);
1186 | }
1187 |
1188 | ////////////////////////////////////////////////////////////
1189 | void vsViewCreate(vsRect viewport, vsVector2 center,
1190 | vsVector2 size, float angle)
1191 | {
1192 | vsView view;
1193 | view.viewport = viewport;
1194 | view.size = size;
1195 | view.center = center;
1196 | view.rotation = angle;
1197 | vsViewSet(view);
1198 | }
1199 |
1200 | ////////////////////////////////////////////////////////////
1201 | vsVector2 vsViewGetCenter()
1202 | {
1203 | vsVector2 center;
1204 | center.x = currentView.center.x;
1205 | center.y = currentView.center.y;
1206 | return center;
1207 | }
1208 |
1209 | ////////////////////////////////////////////////////////////
1210 | vsVector2 vsViewGetSize()
1211 | {
1212 | vsVector2 size;
1213 | size.x = currentView.size.x;
1214 | size.y = currentView.size.y;
1215 | return size;
1216 | }
1217 |
1218 | ////////////////////////////////////////////////////////////
1219 | float vsViewGetRotation()
1220 | {
1221 | return currentView.rotation;
1222 | }
1223 |
1224 |
1225 |
1226 | // ================================
1227 | // ====>> BITMAP
1228 | // ================================
1229 |
1230 | ////////////////////////////////////////////////////////////
1231 | vsBitmap* vsBitmapInit()
1232 | {
1233 | vsBitmap* bm = (vsBitmap*)malloc(sizeof(vsBitmap));
1234 | bm->width = 0;
1235 | bm->height = 0;
1236 | bm->channels = 0;
1237 | bm->data = NULL;
1238 | return bm;
1239 | }
1240 |
1241 | ////////////////////////////////////////////////////////////
1242 | void vsBitmapDestroy(vsBitmap* bitmap)
1243 | {
1244 | if (bitmap->data)
1245 | free(bitmap->data);
1246 | free(bitmap);
1247 | }
1248 |
1249 | ////////////////////////////////////////////////////////////
1250 | void vsBitmapUnload(vsBitmap* bitmap)
1251 | {
1252 | if (bitmap->data != NULL)
1253 | free(bitmap->data);
1254 | bitmap->data = NULL;
1255 | bitmap->width = 0;
1256 | bitmap->height = 0;
1257 | bitmap->channels = 0;
1258 | }
1259 |
1260 | ////////////////////////////////////////////////////////////
1261 | void vsBitmapLoad(vsBitmap* bitmap, const char* filepath)
1262 | {
1263 | //Unload bitmap
1264 | vsBitmapUnload(bitmap);
1265 |
1266 | //Variables
1267 | int stbi_fmt = STBI_rgb_alpha;
1268 | int fsize = 0;
1269 |
1270 | //Open file
1271 | FILE* file = fopen(filepath, "rb");
1272 |
1273 | if (!file) {
1274 | printf("Error in vsTexture : can't open the file\n");
1275 | fclose(file);
1276 | return;
1277 | }
1278 |
1279 | //Get file size
1280 | fseek(file, 0L, SEEK_END);
1281 | fsize = (int)ftell(file);
1282 |
1283 | //Seek to the beginning
1284 | fseek(file, 0L, SEEK_SET);
1285 |
1286 | //Read all the file into filedata
1287 | stbi_uc* fileData = (stbi_uc*)malloc(sizeof(stbi_uc) * fsize);
1288 | fread(fileData, sizeof(stbi_uc) * fsize, 1, file);
1289 | fclose(file);
1290 |
1291 | //Get the image data
1292 | bitmap->data = stbi_load_from_memory(fileData, fsize, &bitmap->width, &bitmap->height,
1293 | &bitmap->channels, stbi_fmt);
1294 |
1295 | //Free the filedata
1296 | free(fileData);
1297 |
1298 | //Check for stb_image fail
1299 | if (bitmap->data == NULL) {
1300 | printf("Error in vsTexture : can't generate texture\n");
1301 | printf("Details : %s\n", stbi_failure_reason());
1302 | return;
1303 | }
1304 |
1305 | }
1306 |
1307 | ////////////////////////////////////////////////////////////
1308 | void vsBitmapLoadFromData(vsBitmap* bitmap, unsigned char* data,
1309 | int width, int height, int channels)
1310 | {
1311 | bitmap->data = data;
1312 | bitmap->width = width;
1313 | bitmap->height = height;
1314 | bitmap->channels = channels;
1315 | }
1316 |
1317 | ////////////////////////////////////////////////////////////
1318 | vsVector2 vsBitmapGetSize(vsBitmap* bitmap)
1319 | {
1320 | return VSVECTOR2((float)bitmap->width, (float)bitmap->height);
1321 | }
1322 |
1323 | ////////////////////////////////////////////////////////////
1324 | int vsBitmapGetChannels(vsBitmap* bitmap)
1325 | {
1326 | return bitmap->channels;
1327 | }
1328 |
1329 | ////////////////////////////////////////////////////////////
1330 | const unsigned char* vsBitmapGetData(vsBitmap* bitmap)
1331 | {
1332 | return bitmap->data;
1333 | }
1334 |
1335 |
1336 |
1337 |
1338 | // ================================
1339 | // ====>> TEXTURE
1340 | // ================================
1341 |
1342 | ////////////////////////////////////////////////////////////
1343 | vsTexture* vsTextureInit()
1344 | {
1345 | vsTexture* texture = (vsTexture*)malloc(sizeof(vsTexture));
1346 | texture->id = 0;
1347 | texture->repeated = 0;
1348 | texture->smooth = 0;
1349 | texture->size = (vsVector2){0, 0};
1350 | return texture;
1351 | }
1352 |
1353 | ////////////////////////////////////////////////////////////
1354 | void vsTextureDestroy(vsTexture* texture)
1355 | {
1356 | if (texture) free(texture);
1357 | }
1358 |
1359 | ////////////////////////////////////////////////////////////
1360 | void vsTextureUnload(vsTexture* texture)
1361 | {
1362 | if (texture->id)
1363 | glDeleteTextures(1, &texture->id);
1364 | texture->id = 0;
1365 | }
1366 |
1367 | ///////////////////////////////////////////////////////////
1368 | void vsTextureLoadFromData(vsTexture* texture, vsBitmap* bitmap)
1369 | {
1370 | if (!texture) return;
1371 |
1372 | //Unload texture
1373 | vsTextureUnload(texture);
1374 |
1375 | //Get the texture format
1376 | unsigned int fmt = GL_RGBA;
1377 | switch (bitmap->channels) {
1378 | case 1: fmt = GL_ALPHA; break;
1379 | case 3: fmt = GL_RGB; break;
1380 | case 4: fmt = GL_RGBA; break;
1381 | default:
1382 | printf("Error in vsTexture : data file format [%d] not recognized\n", fmt);
1383 | return;
1384 | }
1385 |
1386 | //Create texture
1387 | glGenTextures(1, &texture->id);
1388 |
1389 | vsGLStateBindTexture(texture->id);
1390 |
1391 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1392 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1393 |
1394 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1395 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1396 |
1397 | glTexImage2D(GL_TEXTURE_2D, 0, fmt, bitmap->width, bitmap->height, 0, fmt,
1398 | GL_UNSIGNED_BYTE, bitmap->data);
1399 |
1400 | //Check for opengl errors
1401 | GLenum glerr = glGetError();
1402 | if (glerr != GL_NO_ERROR) {
1403 | printf("Error in vsTexture : opengl error %d\n", glerr);
1404 | }
1405 |
1406 | //Set the default values
1407 | texture->size.x = bitmap->width;
1408 | texture->size.y = bitmap->height;
1409 | texture->smooth = VS_TRUE;
1410 | texture->repeated = VS_FALSE;
1411 | }
1412 |
1413 | ////////////////////////////////////////////////////////////
1414 | void vsTextureLoad(vsTexture* texture, const char* filepath)
1415 | {
1416 | //Load bitmap
1417 | vsBitmap* bm = vsBitmapInit();
1418 | vsBitmapLoad(bm, filepath);
1419 |
1420 | //Check for errors
1421 | if (bm->data == NULL) return;
1422 |
1423 | //Load from bitmap
1424 | vsTextureLoadFromData(texture, bm);
1425 |
1426 | //Destroy bitmap
1427 | vsBitmapDestroy(bm);
1428 | }
1429 |
1430 | ////////////////////////////////////////////////////////////
1431 | void vsTextureSetSmooth(vsTexture* texture, const int smooth)
1432 | {
1433 | if (!texture) return;
1434 | if (smooth == texture->smooth) return;
1435 |
1436 | vsGLStateBindTexture(texture->id);
1437 |
1438 | if (smooth)
1439 | {
1440 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1441 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1442 | texture->smooth = VS_TRUE;
1443 | }
1444 | else
1445 | {
1446 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1447 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1448 | texture->smooth = VS_FALSE;
1449 | }
1450 |
1451 | }
1452 |
1453 | ////////////////////////////////////////////////////////////
1454 | void vsTextureSetRepeated(vsTexture* texture, const int repeated)
1455 | {
1456 | if (!texture) return;
1457 | if (repeated == texture->repeated) return;
1458 |
1459 | vsGLStateBindTexture(texture->id);
1460 |
1461 | if (repeated)
1462 | {
1463 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1464 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
1465 | texture->repeated = VS_TRUE;
1466 | }
1467 | else
1468 | {
1469 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1470 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1471 | texture->repeated = VS_FALSE;
1472 | }
1473 | }
1474 |
1475 | ////////////////////////////////////////////////////////////
1476 | vsVector2 vsTextureGetSize(vsTexture* texture)
1477 | {
1478 | if (!texture) return VSVECTOR2(0, 0);
1479 | return texture->size;
1480 | }
1481 |
1482 | ////////////////////////////////////////////////////////////
1483 | int vsTextureIsSmooth(vsTexture* texture)
1484 | {
1485 | if (!texture) return -1;
1486 | return texture->smooth;
1487 | }
1488 |
1489 | ////////////////////////////////////////////////////////////
1490 | int vsTextureIsRepeated(vsTexture* texture)
1491 | {
1492 | if (!texture) return -1;
1493 | return texture->repeated;
1494 | }
1495 |
1496 |
1497 |
1498 |
1499 | // ================================
1500 | // ====>> SHADER
1501 | // ================================
1502 |
1503 | //IOS dont support shaders
1504 | #if !defined(VS_SYS_IOS)
1505 |
1506 | ////////////////////////////////////////////////////////////
1507 | vsShader* vsShaderInit()
1508 | {
1509 | vsShader* shader = (vsShader*)malloc(sizeof(vsShader));
1510 | shader->id = 0;
1511 | shader->paramcount = 0;
1512 | shader->paramcapacity = 4;
1513 | shader->parampos = (int*)malloc(sizeof(int) * 4);
1514 | shader->paramnames = (const char**)malloc(sizeof(char*) * 4);
1515 | return shader;
1516 | }
1517 |
1518 | ////////////////////////////////////////////////////////////
1519 | void vsShaderDestroy(vsShader* shader)
1520 | {
1521 | free(shader->paramnames);
1522 | free(shader->parampos);
1523 | free(shader);
1524 | }
1525 |
1526 | ////////////////////////////////////////////////////////////
1527 | void vsShaderParamCacheResize(vsShader* shader, int size)
1528 | {
1529 | shader->paramnames = (const char**)realloc(shader->paramnames, sizeof(char*) * size);
1530 | shader->parampos = (int*)realloc(shader->parampos, sizeof(int) * size);
1531 | shader->paramcapacity = size;
1532 | }
1533 |
1534 | ////////////////////////////////////////////////////////////
1535 | void vsShaderParamCachePush(vsShader* shader, const char* name, int location)
1536 | {
1537 | if (shader->paramcount == shader->paramcapacity)
1538 | vsShaderParamCacheResize(shader, shader->paramcapacity * 2);
1539 |
1540 | shader->paramnames[shader->paramcount] = name;
1541 | shader->parampos[shader->paramcount] = location;
1542 | shader->paramcount++;
1543 | }
1544 |
1545 | ////////////////////////////////////////////////////////////
1546 | void vsShaderUnload(vsShader* shader)
1547 | {
1548 | if (shader->id) {
1549 | glDeleteProgram(shader->id);
1550 | shader->id = 0;
1551 | }
1552 | }
1553 |
1554 | ////////////////////////////////////////////////////////////
1555 | int vsShaderCompileShader(const char* source, int shadertype)
1556 | {
1557 | unsigned int sp = 0;
1558 |
1559 | //Create shader
1560 | if (shadertype == VS_SHADER_VERTEX) sp = glCreateShader(GL_VERTEX_SHADER);
1561 | else if (shadertype == VS_SHADER_FRAGMENT) sp = glCreateShader(GL_FRAGMENT_SHADER);
1562 | else
1563 | {
1564 | printf("Error in vsShader : unknown shader type\n");
1565 | return -1;
1566 | }
1567 |
1568 | //Compile shader
1569 | glShaderSource(sp, 1, &source, NULL);
1570 | glCompileShader(sp); //Crash here... Why?
1571 |
1572 | //Check the compile log
1573 | GLint success;
1574 | glGetShaderiv(sp, GL_COMPILE_STATUS, &success);
1575 | if (success == GL_FALSE)
1576 | {
1577 | char log[1024];
1578 | glGetShaderInfoLog(sp, sizeof(char) * 1024, 0, log);
1579 | printf("Error in vsShader : failed while compiling the shader\n");
1580 | printf("%s\n", log);
1581 | return -1;
1582 | }
1583 |
1584 | return sp;
1585 | }
1586 |
1587 | ////////////////////////////////////////////////////////////
1588 | void vsShaderCompile(vsShader* shader, const char* source, int shadertype)
1589 | {
1590 | //Unload shader
1591 | vsShaderUnload(shader);
1592 |
1593 | //Create program
1594 | shader->id = glCreateProgram();
1595 |
1596 | //Compile shader from source
1597 | int sp = vsShaderCompileShader(source, shadertype);
1598 |
1599 | //Check for errors
1600 | if (sp == -1) {
1601 | vsShaderUnload(shader);
1602 | return;
1603 | }
1604 |
1605 | //Attach shader
1606 | glAttachShader(shader->id, sp);
1607 |
1608 | //Delete shader
1609 | glDeleteShader(sp);
1610 |
1611 | //Link the program
1612 | glLinkProgram(shader->id);
1613 |
1614 | //Check the link log
1615 | GLint success;
1616 | glGetProgramiv(shader->id, GL_LINK_STATUS, &success);
1617 | if (success == GL_FALSE)
1618 | {
1619 | char log[1024];
1620 | glGetProgramInfoLog(shader->id, sizeof(char) * 1024, 0, log);
1621 | printf("Error in vsShader : failed to link the shader\n");
1622 | printf("%s\n", log);
1623 | vsShaderUnload(shader);
1624 | }
1625 | }
1626 |
1627 | ////////////////////////////////////////////////////////////
1628 | void vsShaderCompile2(vsShader* shader, const char* vertexsource, const char* fragmentsource)
1629 | {
1630 | //Unload shader
1631 | vsShaderUnload(shader);
1632 |
1633 | //Create program
1634 | shader->id = glCreateProgram();
1635 |
1636 | //Compile shader from source
1637 | int vertexshader = vsShaderCompileShader(vertexsource, VS_SHADER_VERTEX);
1638 |
1639 | //Check for errors
1640 | if (vertexshader == -1) {
1641 | vsShaderUnload(shader);
1642 | return;
1643 | }
1644 |
1645 | //Attach shader
1646 | glAttachShader(shader->id, vertexshader);
1647 |
1648 | //Delete shader
1649 | glDeleteShader(vertexshader);
1650 |
1651 | //Compile shader from source
1652 | int fragmentshader = vsShaderCompileShader(fragmentsource , VS_SHADER_FRAGMENT);
1653 |
1654 | //Check for errors
1655 | if (fragmentshader == -1) {
1656 | vsShaderUnload(shader);
1657 | return;
1658 | }
1659 |
1660 | //Attach shader
1661 | glAttachShader(shader->id, fragmentshader);
1662 |
1663 | //Delete shader
1664 | glDeleteShader(fragmentshader);
1665 |
1666 | //Link the program
1667 | glLinkProgram(shader->id);
1668 |
1669 | //Check the link log
1670 | GLint success;
1671 | glGetProgramiv(shader->id, GL_LINK_STATUS, &success);
1672 | if (success == GL_FALSE)
1673 | {
1674 | char log[1024];
1675 | glGetProgramInfoLog(shader->id, sizeof(char) * 1024, 0, log);
1676 | printf("Error in vsShader : failed to link the shader\n");
1677 | printf("%s\n", log);
1678 | vsShaderUnload(shader);
1679 | }
1680 | }
1681 |
1682 | ////////////////////////////////////////////////////////////
1683 | void vsShaderLoad(vsShader* shader, const char* filepath, int shadertype)
1684 | {
1685 | //Variables
1686 | int fsize = 0;
1687 |
1688 | //Open the shader file
1689 | FILE* file = fopen(filepath, "rb");
1690 |
1691 | //Check for errors
1692 | if (!file) {
1693 | printf("Error in vsShader : can't open the file");
1694 | fclose(file);
1695 | return;
1696 | }
1697 |
1698 | //Get file size
1699 | fseek(file, 0L, SEEK_END);
1700 | fsize = (int)ftell(file);
1701 |
1702 | //Seek to the beginning
1703 | fseek(file, 0L, SEEK_SET);
1704 |
1705 | //Allocate text buffer
1706 | char source[fsize];
1707 |
1708 | //Read all the file into filedata
1709 | fread(source, sizeof(char) * fsize, 1, file);
1710 |
1711 | //Close the shader file
1712 | fclose(file);
1713 |
1714 | //Compile shader and attach to the program
1715 | vsShaderCompile(shader, source, shadertype);
1716 | }
1717 |
1718 | ////////////////////////////////////////////////////////////
1719 | void vsShaderLoad2(vsShader* shader, const char* vertexshader_path, const char* fragmentshader_path)
1720 | {
1721 | //Variables
1722 | int fsize = 0;
1723 | char* vertexsh_source = NULL;
1724 | char* fragmentsh_source = NULL;
1725 |
1726 | //Open the shader file
1727 | FILE* vertexsh_file = fopen(vertexshader_path, "rb");
1728 |
1729 | //Check for errors
1730 | if (!vertexsh_file) {
1731 | printf("Error in vsShader : can't open the file");
1732 | fclose(vertexsh_file);
1733 | return;
1734 | }
1735 |
1736 | //Get file size
1737 | fseek(vertexsh_file, 0L, SEEK_END);
1738 | fsize = (int)ftell(vertexsh_file);
1739 |
1740 | //Seek to the beginning
1741 | fseek(vertexsh_file, 0L, SEEK_SET);
1742 |
1743 | //Read all the file into filedata
1744 | fread(vertexsh_source, sizeof(char) * fsize, 1, vertexsh_file);
1745 |
1746 | //Close the shader file
1747 | fclose(vertexsh_file);
1748 |
1749 |
1750 |
1751 | //Open the shader file
1752 | FILE* fragmentsh_file = fopen(fragmentshader_path, "rb");
1753 |
1754 | //Check for errors
1755 | if (!fragmentsh_file) {
1756 | printf("Error in vsShader : can't open the file");
1757 | fclose(fragmentsh_file);
1758 | return;
1759 | }
1760 |
1761 | //Get file size
1762 | fseek(fragmentsh_file, 0L, SEEK_END);
1763 | fsize = (int)ftell(fragmentsh_file);
1764 |
1765 | //Seek to the beginning
1766 | fseek(fragmentsh_file, 0L, SEEK_SET);
1767 |
1768 | //Read all the file into filedata
1769 | fread(fragmentsh_source, sizeof(char) * fsize, 1, fragmentsh_file);
1770 |
1771 | //Close the shader file
1772 | fclose(fragmentsh_file);
1773 |
1774 | //Compile shaders
1775 | vsShaderCompile2(shader, vertexsh_source, fragmentsh_source);
1776 |
1777 | }
1778 |
1779 | ///////////////////////////////////////////////////////////
1780 | void vsShaderBind(vsShader* shader)
1781 | {
1782 | vsGLStateBindShader(shader->id);
1783 | }
1784 |
1785 | ////////////////////////////////////////////////////////////
1786 | unsigned int vsShaderGetID(vsShader* shader)
1787 | {
1788 | return shader->id;
1789 | }
1790 |
1791 | ////////////////////////////////////////////////////////////
1792 | int vsShaderGetParamLocation(vsShader* shader, int paramtype, const char* paramname)
1793 | {
1794 | //Search in the cache
1795 | int i;
1796 | for (i = 0; i < shader->paramcount; i++) {
1797 | if (strcmp(paramname, shader->paramnames[i]) == 0)
1798 | return shader->parampos[i];
1799 | }
1800 |
1801 | //Not in cache, request location from OpenGL
1802 | int location = -1;
1803 |
1804 | if (paramtype == VS_SHADER_PARAM_UNIFORM)
1805 | {
1806 | location = glGetUniformLocation(shader->id, paramname);
1807 | }
1808 | else if (paramtype == VS_SHADER_PARAM_ATTRIBUTE)
1809 | {
1810 | location = glGetAttribLocation(shader->id, paramname);
1811 | }
1812 | else
1813 | {
1814 | printf("Error in vsShader : unknown parameter type\n");
1815 | return -1;
1816 | }
1817 |
1818 | //Check for errors
1819 | if (location == -1) {
1820 | printf("Error in vsShader : parameter %s not found\n", paramname);
1821 | return -1;
1822 | }
1823 |
1824 | //Add the location to the cache
1825 | vsShaderParamCachePush(shader, paramname, location);
1826 |
1827 | return location;
1828 | }
1829 |
1830 | ////////////////////////////////////////////////////////////
1831 | void vsShaderSetParam1(vsShader* shader, const char* paramname, int paramtype,
1832 | const float x)
1833 | {
1834 | //Check for errors
1835 | if (!shader->id) {
1836 | printf("Error in vsShader : can't set parameter to an empty shader\n");
1837 | return;
1838 | }
1839 |
1840 | //Bind shader if needed
1841 | vsGLStateBindShader(shader->id);
1842 |
1843 | //Get param location
1844 | GLint location = vsShaderGetParamLocation(shader, paramtype, paramname);
1845 | if (location == -1) {
1846 | printf("Error in vsShader : null parameter location");
1847 | return;
1848 | }
1849 |
1850 | //Assign new value
1851 | if (paramtype == VS_SHADER_PARAM_UNIFORM) glUniform1f(location, x);
1852 | else if (paramtype == VS_SHADER_PARAM_ATTRIBUTE) glVertexAttrib1f(location, x);
1853 | }
1854 |
1855 | ////////////////////////////////////////////////////////////
1856 | void vsShaderSetParam2(vsShader* shader, const char* paramname, int paramtype,
1857 | const float x, const float y)
1858 | {
1859 | //Check for errors
1860 | if (!shader->id) {
1861 | printf("Error in vsShader : can't set parameter to an empty shader\n");
1862 | return;
1863 | }
1864 |
1865 | //Bind shader if needed
1866 | vsGLStateBindShader(shader->id);
1867 |
1868 | //Get param location
1869 | GLint location = vsShaderGetParamLocation(shader, paramtype, paramname);
1870 | if (location == -1) {
1871 | printf("Error in vsShader : null parameter location");
1872 | return;
1873 | }
1874 |
1875 | //Assign new value
1876 | if (paramtype == VS_SHADER_PARAM_UNIFORM) glUniform2f(location, x, y);
1877 | else if (paramtype == VS_SHADER_PARAM_ATTRIBUTE) glVertexAttrib2f(location, x, y);
1878 | }
1879 |
1880 | ////////////////////////////////////////////////////////////
1881 | void vsShaderSetParam3(vsShader* shader, const char* paramname, int paramtype,
1882 | const float x, const float y, const float z)
1883 | {
1884 | //Check for errors
1885 | if (!shader->id) {
1886 | printf("Error in vsShader : can't set parameter to an empty shader\n");
1887 | return;
1888 | }
1889 |
1890 | //Bind shader if needed
1891 | vsGLStateBindShader(shader->id);
1892 |
1893 | //Get param location
1894 | GLint location = vsShaderGetParamLocation(shader, paramtype, paramname);
1895 | if (location == -1) {
1896 | printf("Error in vsShader : null parameter location");
1897 | return;
1898 | }
1899 |
1900 | //Assign new value
1901 | if (paramtype == VS_SHADER_PARAM_UNIFORM) glUniform3f(location, x, y, z);
1902 | else if (paramtype == VS_SHADER_PARAM_ATTRIBUTE) glVertexAttrib3f(location, x, y, z);
1903 | }
1904 |
1905 | ////////////////////////////////////////////////////////////
1906 | void vsShaderSetParam4(vsShader* shader, const char* paramname, int paramtype,
1907 | const float x, const float y, const float z,
1908 | const float w)
1909 | {
1910 | //Check for errors
1911 | if (!shader->id) {
1912 | printf("Error in vsShader : can't set parameter to an empty shader\n");
1913 | return;
1914 | }
1915 |
1916 | //Bind shader if needed
1917 | vsGLStateBindShader(shader->id);
1918 |
1919 | //Get param location
1920 | GLint location = vsShaderGetParamLocation(shader, paramtype, paramname);
1921 | if (location == -1) {
1922 | printf("Error in vsShader : null parameter location");
1923 | return;
1924 | }
1925 |
1926 | //Assign new value
1927 | if (paramtype == VS_SHADER_PARAM_UNIFORM) glUniform4f(location, x, y, z, w);
1928 | else if (paramtype == VS_SHADER_PARAM_ATTRIBUTE) glVertexAttrib4f(location, x, y, z, w);
1929 | }
1930 |
1931 | #endif
1932 |
1933 |
1934 |
1935 | // ================================
1936 | // ====>> FONT
1937 | // ================================
1938 |
1939 | #if defined(VS_FREETYPE)
1940 |
1941 | ////////////////////////////////////////////////////////////
1942 | vsFont* vsFontInit()
1943 | {
1944 | vsFont* font = (vsFont*)malloc(sizeof(vsFont));
1945 | font->texture = NULL;
1946 | font->texcoords_table = (vsRect*)malloc(sizeof(vsRect) * VS_FONT_CH_COUNT);
1947 | font->ch_widths = (unsigned int*)malloc(sizeof(unsigned int) * VS_FONT_CH_COUNT);
1948 | font->ch_height = 0;
1949 | return font;
1950 | }
1951 |
1952 | ////////////////////////////////////////////////////////////
1953 | void vsFontDestroy(vsFont* font)
1954 | {
1955 | if (font->texture) vsTextureDestroy(font->texture);
1956 | if (font->texcoords_table) free(font->texcoords_table);
1957 | if (font->ch_widths) free(font->ch_widths);
1958 | font->ch_height = 0;
1959 | free(font);
1960 | }
1961 |
1962 | ////////////////////////////////////////////////////////////
1963 | void vsFontLoad(vsFont* font, const char* filepath, unsigned int size)
1964 | {
1965 | static const size_t margin = 3;
1966 |
1967 | //Step 1: Open the font using FreeType
1968 | FT_Face face;
1969 | if (FT_New_Face(ftlib, filepath, 0, &face) != 0) {
1970 | printf("Error: can't load font file\n");
1971 | return;
1972 | }
1973 |
1974 | //Abort if this is not a scalable font
1975 | if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) ||
1976 | !(face->face_flags & FT_FACE_FLAG_HORIZONTAL))
1977 | {
1978 | printf("Error: the font is not a scalable font\n");
1979 | return;
1980 | }
1981 |
1982 | //Set the font size
1983 | FT_Set_Pixel_Sizes(face, 0, size);
1984 |
1985 | //Step 2: Find maxAscent/Descent to calculate imageHeight
1986 | int imageHeight = 0;
1987 | int imageWidth = 256;
1988 | int maxDescent = 0;
1989 | int maxAscent = 0;
1990 | size_t lineSpace = imageWidth - margin;
1991 | size_t lines = 1;
1992 | char charIndex;
1993 |
1994 | for (unsigned int ch = 0; ch < VS_FONT_CH_COUNT; ch++) {
1995 |
1996 | // Look up the character in the font file.
1997 | charIndex = FT_Get_Char_Index(face, ch + VS_FONT_CH_START);
1998 |
1999 | // Render the current glyph.
2000 | FT_Load_Glyph(face, charIndex, FT_LOAD_RENDER);
2001 |
2002 | font->ch_widths[ch] = (face->glyph->metrics.horiAdvance >> 6) + margin;
2003 |
2004 | // If the line is full go to the next line
2005 | if (font->ch_widths[ch] > lineSpace) {
2006 | lineSpace = imageWidth - margin;
2007 | ++lines;
2008 | }
2009 | lineSpace -= font->ch_widths[ch];
2010 |
2011 | maxAscent = (face->glyph->bitmap_top > maxAscent) ? face->glyph->bitmap_top : maxAscent;
2012 | maxDescent = (face->glyph->bitmap.rows - face->glyph->bitmap_top > maxDescent) ? face->glyph->bitmap.rows - face->glyph->bitmap_top : maxDescent;
2013 | }
2014 |
2015 | //font->ch_height = maxAscent + maxDescent; // calculate height for text
2016 | font->ch_height = size;
2017 |
2018 | // Compute how high the texture has to be.
2019 | size_t neededHeight = (maxAscent + maxDescent + margin) * lines + margin;
2020 |
2021 | // Get the first power of two in which it will fit
2022 | imageHeight = 16;
2023 | while(imageHeight < (int)neededHeight)
2024 | imageHeight <<= 1;
2025 |
2026 | // Step 3: Generation of the actual texture //
2027 |
2028 | // create and zero the memory
2029 | unsigned char* image = (unsigned char*)malloc(imageHeight * imageWidth);
2030 | memset(image, 0, imageHeight * imageWidth);
2031 |
2032 | // These are the position at which to draw the next glyph
2033 | size_t x = margin;
2034 | size_t y = margin + maxAscent;
2035 |
2036 | // Drawing loop
2037 | for (unsigned int ch = 0; ch < VS_FONT_CH_COUNT; ++ch)
2038 | {
2039 | unsigned int charIndex = FT_Get_Char_Index(face, ch + VS_FONT_CH_START);
2040 |
2041 | // Render the glyph
2042 | FT_Load_Glyph(face, charIndex, FT_LOAD_DEFAULT);
2043 | FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
2044 |
2045 | // See whether the character fits on the current line
2046 | if (font->ch_widths[ch] > imageWidth - x)
2047 | {
2048 | x = margin;
2049 | y += (font->ch_height + margin);
2050 | }
2051 |
2052 | // calculate texture coordinates of the character
2053 | font->texcoords_table[ch].x = (float)x;
2054 | font->texcoords_table[ch].w = (float)font->ch_widths[ch] - margin;
2055 | font->texcoords_table[ch].y = (float)y - maxAscent;
2056 | font->texcoords_table[ch].h = (float)size;
2057 |
2058 | // copy image generated by FreeType to the texture
2059 | for(int row = 0; row < face->glyph->bitmap.rows; ++row)
2060 | {
2061 | for(int pixel = 0; pixel < face->glyph->bitmap.width; ++pixel)
2062 | {
2063 | // set pixel at position to intensity (0-255) at the position
2064 | image[(x + face->glyph->bitmap_left + pixel) +
2065 | (y - face->glyph->bitmap_top + row) * imageWidth] =
2066 | face->glyph->bitmap.buffer[pixel + row * face->glyph->bitmap.pitch];
2067 | }
2068 | }
2069 |
2070 | x += font->ch_widths[ch];
2071 | }
2072 |
2073 | //Create bitmap
2074 | vsBitmap* bm = vsBitmapInit();
2075 | vsBitmapLoadFromData(bm, image, imageWidth, imageHeight, 1);
2076 |
2077 | //Destroy texture
2078 | if (font->texture)
2079 | vsTextureDestroy(font->texture);
2080 |
2081 | //Generate opengl texture from bitmap
2082 | font->texture = vsTextureInit();
2083 | vsTextureLoadFromData(font->texture, bm);
2084 |
2085 | //Destroy bitmap
2086 | vsBitmapDestroy(bm);
2087 |
2088 | //Done
2089 | FT_Done_Face(face); // free the face data
2090 | }
2091 |
2092 | ////////////////////////////////////////////////////////////
2093 | vsTexture* vsFontGetTexture(vsFont* font)
2094 | {
2095 | return font->texture;
2096 | }
2097 |
2098 | ////////////////////////////////////////////////////////////
2099 | const vsRect* vsFontGetTexCoord(vsFont* font, const char ch)
2100 | {
2101 | return &font->texcoords_table[(int)ch];
2102 | }
2103 |
2104 | ////////////////////////////////////////////////////////////
2105 | unsigned int vsFontGetLenght(vsFont* font, const char* text, float scalex)
2106 | {
2107 | const int char_count = strlen(text);
2108 | unsigned int old_lenght = 0;
2109 | unsigned int lenght = 0;
2110 | for (int i = 0; i < char_count; i++) {
2111 |
2112 | //Newline
2113 | if (text[i] == '\n')
2114 | {
2115 | if (lenght > old_lenght) old_lenght = lenght;
2116 | lenght = 0;
2117 | continue;
2118 | }
2119 |
2120 | //Unsupported characters and space
2121 | if (text[i] < VS_FONT_CH_START || text[i] > VS_FONT_CH_END || text[i] == ' ')
2122 | {
2123 | lenght += font->ch_widths[0] * scalex;
2124 | continue;
2125 | }
2126 |
2127 | lenght += font->ch_widths[(int)text[i] - VS_FONT_CH_START] * scalex;
2128 | }
2129 | return lenght > old_lenght ? lenght : old_lenght;
2130 | }
2131 |
2132 | #endif //VS_FREETYPE
2133 |
2134 |
2135 |
2136 |
2137 | // ================================
2138 | // ====>> RENDERER
2139 | // ================================
2140 |
2141 | ////////////////////////////////////////////////////////////
2142 | void vsRendererClear()
2143 | {
2144 | glClear(GL_COLOR_BUFFER_BIT);
2145 | }
2146 |
2147 | ////////////////////////////////////////////////////////////
2148 | void vsRendererDisplay()
2149 | {
2150 | if (!renderer.countverts) return;
2151 |
2152 | //Draw
2153 | glVertexPointer(2, GL_FLOAT, 0, renderer.vertexbuf);
2154 | glColorPointer(4, GL_UNSIGNED_BYTE, 0, renderer.colorbuf);
2155 | glTexCoordPointer(2, GL_FLOAT, 0, renderer.texsourcebuf);
2156 | vsGLStateBindBuffer(renderer.ibo, GL_ELEMENT_ARRAY_BUFFER);
2157 | glDrawElements(GL_TRIANGLES, renderer.countverts, GL_UNSIGNED_SHORT, 0);
2158 |
2159 | renderer.buffersize = 0;
2160 | renderer.countverts = 0;
2161 | }
2162 |
2163 | ////////////////////////////////////////////////////////////
2164 | void vsRendererDraw(vsTexture* texture, float x, float y, float x2, float y2,
2165 | float x3, float y3, float x4, float y4, float tx_x, float tx_y,
2166 | float tx_w, float tx_h, vsColor color)
2167 | {
2168 | if (texture == NULL)
2169 | {
2170 | if (glstate.currentTexture != 0) {
2171 | vsRendererDisplay();
2172 | vsGLStateBindTexture(0);
2173 | }
2174 | }
2175 | else
2176 | {
2177 | if (glstate.currentTexture != texture->id) {
2178 | vsRendererDisplay();
2179 | vsGLStateBindTexture(texture->id);
2180 | }
2181 | }
2182 |
2183 | if (renderer.buffersize == 1024)
2184 | vsRendererDisplay();
2185 |
2186 | //Vertex 1
2187 | renderer.vertexbuf[renderer.buffersize][0] = x;
2188 | renderer.vertexbuf[renderer.buffersize][1] = y;
2189 |
2190 | renderer.texsourcebuf[renderer.buffersize][0] = tx_x;
2191 | renderer.texsourcebuf[renderer.buffersize][1] = tx_y;
2192 |
2193 | renderer.colorbuf[renderer.buffersize][0] = color.r;
2194 | renderer.colorbuf[renderer.buffersize][1] = color.g;
2195 | renderer.colorbuf[renderer.buffersize][2] = color.b;
2196 | renderer.colorbuf[renderer.buffersize][3] = color.a;
2197 |
2198 | renderer.buffersize++;
2199 |
2200 | //Vertex 2
2201 | renderer.vertexbuf[renderer.buffersize][0] = x2;
2202 | renderer.vertexbuf[renderer.buffersize][1] = y2;
2203 |
2204 | renderer.texsourcebuf[renderer.buffersize][0] = tx_x + tx_w;
2205 | renderer.texsourcebuf[renderer.buffersize][1] = tx_y;
2206 |
2207 | renderer.colorbuf[renderer.buffersize][0] = color.r;
2208 | renderer.colorbuf[renderer.buffersize][1] = color.g;
2209 | renderer.colorbuf[renderer.buffersize][2] = color.b;
2210 | renderer.colorbuf[renderer.buffersize][3] = color.a;
2211 |
2212 | renderer.buffersize++;
2213 |
2214 | //Vertex 3
2215 | renderer.vertexbuf[renderer.buffersize][0] = x3;
2216 | renderer.vertexbuf[renderer.buffersize][1] = y3;
2217 |
2218 | renderer.texsourcebuf[renderer.buffersize][0] = tx_x + tx_w;
2219 | renderer.texsourcebuf[renderer.buffersize][1] = tx_y + tx_h;
2220 |
2221 | renderer.colorbuf[renderer.buffersize][0] = color.r;
2222 | renderer.colorbuf[renderer.buffersize][1] = color.g;
2223 | renderer.colorbuf[renderer.buffersize][2] = color.b;
2224 | renderer.colorbuf[renderer.buffersize][3] = color.a;
2225 |
2226 | renderer.buffersize++;
2227 |
2228 | //Vertex 4
2229 | renderer.vertexbuf[renderer.buffersize][0] = x4;
2230 | renderer.vertexbuf[renderer.buffersize][1] = y4;
2231 |
2232 | renderer.texsourcebuf[renderer.buffersize][0] = tx_x;
2233 | renderer.texsourcebuf[renderer.buffersize][1] = tx_y + tx_h;
2234 |
2235 | renderer.colorbuf[renderer.buffersize][0] = color.r;
2236 | renderer.colorbuf[renderer.buffersize][1] = color.g;
2237 | renderer.colorbuf[renderer.buffersize][2] = color.b;
2238 | renderer.colorbuf[renderer.buffersize][3] = color.a;
2239 |
2240 | renderer.buffersize++;
2241 |
2242 | renderer.countverts += 6;
2243 | }
2244 |
2245 | ////////////////////////////////////////////////////////////
2246 | void vsRendererDrawSprite(vsSprite* sprite)
2247 | {
2248 | static vsVector2 v1;
2249 | static vsVector2 v2;
2250 | static vsVector2 v3;
2251 | static vsVector2 v4;
2252 |
2253 | if (sprite->rotation)
2254 | {
2255 | const float ca = cosf(sprite->rotation * 3.14159 / 180);
2256 | const float sa = sinf(sprite->rotation * 3.14159 / 180);
2257 |
2258 | const float cx = sprite->position.x + sprite->origin.x;
2259 | const float cy = sprite->position.y + sprite->origin.y;
2260 |
2261 | const float x = sprite->position.x - cx;
2262 | const float y = sprite->position.y - cy;
2263 | const float w = sprite->position.x + sprite->size.x - cx;
2264 | const float h = sprite->position.y + sprite->size.y - cy;
2265 |
2266 | v1.x = x*ca - y*sa + cx;
2267 | v1.y = x*sa + y*ca + cy;
2268 |
2269 | v2.x = w*ca - y*sa + cx;
2270 | v2.y = w*sa + y*ca + cy;
2271 |
2272 | v3.x = w*ca - h*sa + cx;
2273 | v3.y = w*sa + h*ca + cy;
2274 |
2275 | v4.x = x*ca - h*sa + cx;
2276 | v4.y = x*sa + h*ca + cy;
2277 | }
2278 | else
2279 | {
2280 | v1.x = sprite->position.x - sprite->origin.x;
2281 | v1.y = sprite->position.y - sprite->origin.y;
2282 |
2283 | v2.x = sprite->position.x + sprite->size.x - sprite->origin.x;
2284 | v2.y = sprite->position.y - sprite->origin.y;
2285 |
2286 | v3.x = sprite->position.x + sprite->size.x - sprite->origin.x;
2287 | v3.y = sprite->position.y + sprite->size.y - sprite->origin.y;
2288 |
2289 | v4.x = sprite->position.x - sprite->origin.x;
2290 | v4.y = sprite->position.y + sprite->size.y - sprite->origin.y;
2291 | }
2292 |
2293 | if (sprite->texture)
2294 | {
2295 | vsRendererDraw(sprite->texture,
2296 | v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, v4.x, v4.y,
2297 | sprite->texsource.x / sprite->texture->size.x,
2298 | sprite->texsource.y / sprite->texture->size.y,
2299 | sprite->texsource.w / sprite->texture->size.x,
2300 | sprite->texsource.h / sprite->texture->size.y,
2301 | sprite->color);
2302 | }
2303 | else
2304 | {
2305 | vsRendererDraw(NULL,
2306 | v1.x, v1.y, v2.x, v2.y, v3.x, v3.y, v4.x, v4.y,
2307 | 0, 0, 0, 0, sprite->color);
2308 | }
2309 | }
2310 |
2311 | ////////////////////////////////////////////////////////////
2312 | void vsRendererDrawRect(vsTexture* texture, float tx, float ty, float tw, float th,
2313 | float x, float y, float w, float h, vsColor color)
2314 | {
2315 | if (texture == NULL)
2316 | {
2317 | vsRendererDraw(NULL, x, y, x + w, y, x + w, y + h, x, y + h, 0, 0, 0, 0, color);
2318 | }
2319 | else
2320 | {
2321 | vsRendererDraw(texture, x, y, x + w, y, x + w, y + h, x, y + h,
2322 | tx / texture->size.x, ty / texture->size.y, tw / texture->size.x,
2323 | th / texture->size.y, color);
2324 | }
2325 | }
2326 |
2327 | #if defined(VS_FREETYPE)
2328 |
2329 | ////////////////////////////////////////////////////////////
2330 | void vsRendererDrawTextRaw(vsFont* font, const char* text, float x, float y,
2331 | float scalex, float scaley, unsigned int alignment, vsColor color)
2332 | {
2333 | static int char_count; char_count = strlen(text);
2334 | static vsRect char_txc;
2335 | static float xorigin = 0, yorigin = 0;
2336 | static float xpos, ypos; xpos = x; ypos = y;
2337 | static unsigned int text_lenght = 0;
2338 |
2339 | //Check text alignment
2340 | if (alignment == VS_TEXT_ALIGN_CENTER) {
2341 | text_lenght = vsFontGetLenght(font, text, scalex);
2342 | xorigin = text_lenght/2;
2343 | }
2344 |
2345 | for (int i = 0; i < char_count; i++) {
2346 |
2347 | //Newline: update x and y position
2348 | if (text[i] == '\n') {
2349 | xpos = x;
2350 | ypos += (font->ch_height + 1) * scaley;
2351 | continue;
2352 | }
2353 |
2354 | //Jump unsupported characters and space
2355 | if (text[i] < VS_FONT_CH_START || text[i] > VS_FONT_CH_END || text[i] == ' ') {
2356 | xpos += font->ch_widths[0] * scalex;
2357 | continue;
2358 | }
2359 |
2360 | //Get character texture coordinates
2361 | char_txc = *vsFontGetTexCoord(font, text[i] - VS_FONT_CH_START);
2362 |
2363 | //Draw character
2364 | vsRendererDrawRect(font->texture,
2365 | char_txc.x, char_txc.y, char_txc.w, char_txc.h,
2366 | xpos - xorigin, ypos - yorigin,
2367 | font->texcoords_table[text[i] - VS_FONT_CH_START].w * scalex,
2368 | font->ch_height * scaley,
2369 | color);
2370 | //Update x position
2371 | xpos += font->ch_widths[text[i] - VS_FONT_CH_START] * scalex;
2372 | }
2373 | }
2374 |
2375 | ////////////////////////////////////////////////////////////
2376 | void vsRendererDrawText(vsText* text)
2377 | {
2378 | vsRendererDrawTextRaw(text->font, text->text, text->pos.x, text->pos.y, text->scale.x,
2379 | text->scale.y, text->alignment, text->color);
2380 | }
2381 |
2382 | #endif
2383 |
2384 | ////////////////////////////////////////////////////////////
2385 | void vsRendererToggleWireFrame()
2386 | {
2387 | renderer.wireframe = !renderer.wireframe;
2388 |
2389 | if (renderer.wireframe) {
2390 | glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
2391 | glDisable(GL_TEXTURE_2D);
2392 | }
2393 | else
2394 | {
2395 | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
2396 | glEnable(GL_TEXTURE_2D);
2397 | }
2398 | }
2399 |
2400 | #endif //VS_GRAPHICS_IMPLEMENTATION
2401 |
--------------------------------------------------------------------------------
/src/VSSystem.h:
--------------------------------------------------------------------------------
1 | //=======================================================================================
2 | // VIRUAL SHOCK ENGINE
3 | //=======================================================================================
4 | //
5 | // Copyright (c) 2013-2015 Carlo Meroni
6 | //
7 | // This software is provided 'as-is', without any express or implied warranty.
8 | // In no event will the authors be held liable for any damages arising from
9 | // the use of this software.
10 | //
11 | // Permission is granted to anyone to use this software for any purpose,
12 | // including commercial applications, and to alter it and redistribute it freely,
13 | // subject to the following restrictions:
14 | //
15 | // 1. The origin of this software must not be misrepresented;
16 | // you must not claim that you wrote the original software.
17 | // If you use this software in a product, an acknowledgment
18 | // in the product documentation would be appreciated but is
19 | // not required.
20 | //
21 | // 2. Altered source versions must be plainly marked as such,
22 | // and must not be misrepresented as being the original software.
23 | //
24 | // 3. This notice may not be removed or altered from any source
25 | // distribution.
26 | //=======================================================================================
27 |
28 | ////////////////////////////////////////////////////////////
29 | /// HEADER
30 | ////////////////////////////////////////////////////////////
31 | #ifndef VS_SYSTEM_H
32 | #define VS_SYSTEM_H
33 |
34 | #ifdef __cplusplus
35 | extern "C" {
36 | #endif
37 |
38 | ////////////////////////////////////////////////////////////
39 | /// OS
40 | ////////////////////////////////////////////////////////////
41 |
42 | // Identify the operating system
43 | #if defined(_WIN32)
44 | //Windows
45 | #define VS_SYS_WINDOWS
46 | #elif defined(__APPLE__)
47 | #include "TargetConditionals.h"
48 | #if TARGET_IPHONE_SIMULATOR
49 | // iOS Simulator
50 | #define VS_SYS_IOS
51 | #elif TARGET_OS_IPHONE
52 | // iOS device
53 | #define VS_SYS_IOS
54 | #elif TARGET_OS_MAC
55 | //Mac
56 | #define VS_SYS_MAC
57 | #else
58 | //Error
59 | #error This operating system is not supported!
60 | #endif
61 |
62 | #elif defined(__linux__)
63 | //Linux
64 | #define VS_SYS_LINUX
65 | #else
66 | //Other systems
67 | #error This operating system is not supported!
68 | #endif
69 |
70 | //Define import / export macros
71 | #if defined(VS_SYS_WINDOWS)
72 |
73 | #if defined(VSSYSTEM_EXPORTS)
74 | #define VSSYSTEM_API __declspec(dllexport)
75 | #else
76 | #define VSSYSTEM_API __declspec(dllimport)
77 | #endif
78 |
79 | #else
80 |
81 | #define VSSYSTEM_API
82 |
83 | #endif
84 |
85 |
86 |
87 | ////////////////////////////////////////////////////////////
88 | /// MODULE MANAGER
89 | ////////////////////////////////////////////////////////////
90 |
91 | /*
92 |
93 | Modules:
94 | SYSTEM
95 | WINDOW
96 | TIME
97 | KEY
98 | MOUSE
99 |
100 | By default all moudules are exported.
101 | To export only one specific module, you should
102 | define VS_ONLY_$MODULE before including this file.
103 |
104 | If you want just the OS defines you should
105 | define VS_NO_EXPORT before including this file
106 |
107 | */
108 |
109 | #if defined(VS_ONLY_SYSTEM) || defined(VS_ONLY_WINDOW) || defined(VS_ONLY_TIME)||\
110 | defined(KEY) || defined(MOUSE)
111 |
112 | #ifdef VS_ONLY_SYSTEM
113 | #define VS_EXPORT_SYSTEM
114 | #endif
115 |
116 | #ifdef VS_ONLY_WINDOW
117 | #define VS_EXPORT_WINDOW
118 | #endif
119 |
120 | #ifdef VS_ONLY_TIME
121 | #define VS_EXPORT_TIME
122 | #endif
123 |
124 | #ifdef VS_ONLY_KEY
125 | #define VS_EXPORT_KEY
126 | #endif
127 |
128 | #ifdef VS_ONLY_MOUSE
129 | #define VS_EXPORT_MOUSE
130 | #endif
131 |
132 | #else
133 |
134 | //Define all modules
135 | #define VS_EXPORT_SYSTEM
136 | #define VS_EXPORT_WINDOW
137 | #define VS_EXPORT_TIME
138 | #define VS_EXPORT_KEY
139 | #define VS_EXPORT_MOUSE
140 |
141 | #endif
142 |
143 | #if defined(VS_NO_EXPORT)
144 |
145 | //Undefine all modules
146 | #undef VS_EXPORT_SYSTEM
147 | #undef VS_EXPORT_WINDOW
148 | #undef VS_EXPORT_TIME
149 | #undef VS_EXPORT_KEY
150 | #undef VS_EXPORT_MOUSE
151 |
152 | #endif
153 |
154 | #if defined(VS_SYSTEM_IMPLEMENTATION)
155 |
156 | //Undefine all modules
157 | #undef VS_EXPORT_SYSTEM
158 | #undef VS_EXPORT_WINDOW
159 | #undef VS_EXPORT_TIME
160 | #undef VS_EXPORT_KEY
161 | #undef VS_EXPORT_MOUSE
162 |
163 | #endif
164 |
165 |
166 |
167 | ////////////////////////////////////////////////////////////
168 | /// COSTANTS
169 | ////////////////////////////////////////////////////////////
170 |
171 | //Boolean
172 | #define VS_FALSE 0
173 | #define VS_TRUE 1
174 |
175 | //Window style bitmasks
176 | #define VS_WINSTYLE_HIDDEN (1 << 1)
177 | #define VS_WINSTYLE_RESIZABLE (1 << 2)
178 | #define VS_WINSTYLE_FULLSCREEN (1 << 3)
179 | #define VS_WINSTYLE_ALLOW_HIGHDPI (1 << 4)
180 |
181 | //Keys
182 | enum
183 | {
184 | VS_KEY_UNKNOWN = 0,
185 |
186 | /**
187 | * \name Usage page 0x07
188 | *
189 | * These values are from usage page 0x07 (USB keyboard page).
190 | */
191 | /* @{ */
192 |
193 | VS_KEY_A = 4,
194 | VS_KEY_B = 5,
195 | VS_KEY_C = 6,
196 | VS_KEY_D = 7,
197 | VS_KEY_E = 8,
198 | VS_KEY_F = 9,
199 | VS_KEY_G = 10,
200 | VS_KEY_H = 11,
201 | VS_KEY_I = 12,
202 | VS_KEY_J = 13,
203 | VS_KEY_K = 14,
204 | VS_KEY_L = 15,
205 | VS_KEY_M = 16,
206 | VS_KEY_N = 17,
207 | VS_KEY_O = 18,
208 | VS_KEY_P = 19,
209 | VS_KEY_Q = 20,
210 | VS_KEY_R = 21,
211 | VS_KEY_S = 22,
212 | VS_KEY_T = 23,
213 | VS_KEY_U = 24,
214 | VS_KEY_V = 25,
215 | VS_KEY_W = 26,
216 | VS_KEY_X = 27,
217 | VS_KEY_Y = 28,
218 | VS_KEY_Z = 29,
219 |
220 | VS_KEY_1 = 30,
221 | VS_KEY_2 = 31,
222 | VS_KEY_3 = 32,
223 | VS_KEY_4 = 33,
224 | VS_KEY_5 = 34,
225 | VS_KEY_6 = 35,
226 | VS_KEY_7 = 36,
227 | VS_KEY_8 = 37,
228 | VS_KEY_9 = 38,
229 | VS_KEY_0 = 39,
230 |
231 | VS_KEY_RETURN = 40,
232 | VS_KEY_ESCAPE = 41,
233 | VS_KEY_BACKSPACE = 42,
234 | VS_KEY_TAB = 43,
235 | VS_KEY_SPACE = 44,
236 |
237 | VS_KEY_MINUS = 45,
238 | VS_KEY_EQUALS = 46,
239 | VS_KEY_LEFTBRACKET = 47,
240 | VS_KEY_RIGHTBRACKET = 48,
241 | VS_KEY_BACKSLASH = 49, /**< Located at the lower left of the return
242 | * key on ISO keyboards and at the right end
243 | * of the QWERTY row on ANSI keyboards.
244 | * Produces REVERSE SOLIDUS (backslash) and
245 | * VERTICAL LINE in a US layout, REVERSE
246 | * SOLIDUS and VERTICAL LINE in a UK Mac
247 | * layout, NUMBER SIGN and TILDE in a UK
248 | * Windows layout, DOLLAR SIGN and POUND SIGN
249 | * in a Swiss German layout, NUMBER SIGN and
250 | * APOSTROPHE in a German layout, GRAVE
251 | * ACCENT and POUND SIGN in a French Mac
252 | * layout, and ASTERISK and MICRO SIGN in a
253 | * French Windows layout.
254 | */
255 | VS_KEY_NONUSHASH = 50, /**< ISO USB keyboards actually use this code
256 | * instead of 49 for the same key, but all
257 | * OSes I've seen treat the two codes
258 | * identically. So, as an implementor, unless
259 | * your keyboard generates both of those
260 | * codes and your OS treats them differently,
261 | * you should generate VS_KEY_BACKSLASH
262 | * instead of this code. As a user, you
263 | * should not rely on this code because SDL
264 | * will never generate it with most (all?)
265 | * keyboards.
266 | */
267 | VS_KEY_SEMICOLON = 51,
268 | VS_KEY_APOSTROPHE = 52,
269 | VS_KEY_GRAVE = 53, /**< Located in the top left corner (on both ANSI
270 | * and ISO keyboards). Produces GRAVE ACCENT and
271 | * TILDE in a US Windows layout and in US and UK
272 | * Mac layouts on ANSI keyboards, GRAVE ACCENT
273 | * and NOT SIGN in a UK Windows layout, SECTION
274 | * SIGN and PLUS-MINUS SIGN in US and UK Mac
275 | * layouts on ISO keyboards, SECTION SIGN and
276 | * DEGREE SIGN in a Swiss German layout (Mac:
277 | * only on ISO keyboards), CIRCUMFLEX ACCENT and
278 | * DEGREE SIGN in a German layout (Mac: only on
279 | * ISO keyboards), SUPERSCRIPT TWO and TILDE in a
280 | * French Windows layout, COMMERCIAL AT and
281 | * NUMBER SIGN in a French Mac layout on ISO
282 | * keyboards, and LESS-THAN SIGN and GREATER-THAN
283 | * SIGN in a Swiss German, German, or French Mac
284 | * layout on ANSI keyboards.
285 | */
286 | VS_KEY_COMMA = 54,
287 | VS_KEY_PERIOD = 55,
288 | VS_KEY_SLASH = 56,
289 |
290 | VS_KEY_CAPSLOCK = 57,
291 |
292 | VS_KEY_F1 = 58,
293 | VS_KEY_F2 = 59,
294 | VS_KEY_F3 = 60,
295 | VS_KEY_F4 = 61,
296 | VS_KEY_F5 = 62,
297 | VS_KEY_F6 = 63,
298 | VS_KEY_F7 = 64,
299 | VS_KEY_F8 = 65,
300 | VS_KEY_F9 = 66,
301 | VS_KEY_F10 = 67,
302 | VS_KEY_F11 = 68,
303 | VS_KEY_F12 = 69,
304 |
305 | VS_KEY_PRINTSCREEN = 70,
306 | VS_KEY_SCROLLLOCK = 71,
307 | VS_KEY_PAUSE = 72,
308 | VS_KEY_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but
309 | does send code 73, not 117) */
310 | VS_KEY_HOME = 74,
311 | VS_KEY_PAGEUP = 75,
312 | VS_KEY_DELETE = 76,
313 | VS_KEY_END = 77,
314 | VS_KEY_PAGEDOWN = 78,
315 | VS_KEY_RIGHT = 79,
316 | VS_KEY_LEFT = 80,
317 | VS_KEY_DOWN = 81,
318 | VS_KEY_UP = 82,
319 |
320 | VS_KEY_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards
321 | */
322 | VS_KEY_KP_DIVIDE = 84,
323 | VS_KEY_KP_MULTIPLY = 85,
324 | VS_KEY_KP_MINUS = 86,
325 | VS_KEY_KP_PLUS = 87,
326 | VS_KEY_KP_ENTER = 88,
327 | VS_KEY_KP_1 = 89,
328 | VS_KEY_KP_2 = 90,
329 | VS_KEY_KP_3 = 91,
330 | VS_KEY_KP_4 = 92,
331 | VS_KEY_KP_5 = 93,
332 | VS_KEY_KP_6 = 94,
333 | VS_KEY_KP_7 = 95,
334 | VS_KEY_KP_8 = 96,
335 | VS_KEY_KP_9 = 97,
336 | VS_KEY_KP_0 = 98,
337 | VS_KEY_KP_PERIOD = 99,
338 |
339 | VS_KEY_NONUSBACKSLASH = 100, /**< This is the additional key that ISO
340 | * keyboards have over ANSI ones,
341 | * located between left shift and Y.
342 | * Produces GRAVE ACCENT and TILDE in a
343 | * US or UK Mac layout, REVERSE SOLIDUS
344 | * (backslash) and VERTICAL LINE in a
345 | * US or UK Windows layout, and
346 | * LESS-THAN SIGN and GREATER-THAN SIGN
347 | * in a Swiss German, German, or French
348 | * layout. */
349 | VS_KEY_APPLICATION = 101, /**< windows contextual menu, compose */
350 | VS_KEY_POWER = 102, /**< The USB document says this is a status flag,
351 | * not a physical key - but some Mac keyboards
352 | * do have a power key. */
353 | VS_KEY_KP_EQUALS = 103,
354 | VS_KEY_F13 = 104,
355 | VS_KEY_F14 = 105,
356 | VS_KEY_F15 = 106,
357 | VS_KEY_F16 = 107,
358 | VS_KEY_F17 = 108,
359 | VS_KEY_F18 = 109,
360 | VS_KEY_F19 = 110,
361 | VS_KEY_F20 = 111,
362 | VS_KEY_F21 = 112,
363 | VS_KEY_F22 = 113,
364 | VS_KEY_F23 = 114,
365 | VS_KEY_F24 = 115,
366 | VS_KEY_EXECUTE = 116,
367 | VS_KEY_HELP = 117,
368 | VS_KEY_MENU = 118,
369 | VS_KEY_SELECT = 119,
370 | VS_KEY_STOP = 120,
371 | VS_KEY_AGAIN = 121, /**< redo */
372 | VS_KEY_UNDO = 122,
373 | VS_KEY_CUT = 123,
374 | VS_KEY_COPY = 124,
375 | VS_KEY_PASTE = 125,
376 | VS_KEY_FIND = 126,
377 | VS_KEY_MUTE = 127,
378 | VS_KEY_VOLUMEUP = 128,
379 | VS_KEY_VOLUMEDOWN = 129,
380 | /* not sure whether there's a reason to enable these */
381 | /* VS_KEY_LOCKINGCAPSLOCK = 130, */
382 | /* VS_KEY_LOCKINGNUMLOCK = 131, */
383 | /* VS_KEY_LOCKINGSCROLLLOCK = 132, */
384 | VS_KEY_KP_COMMA = 133,
385 | VS_KEY_KP_EQUALSAS400 = 134,
386 |
387 | VS_KEY_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see
388 | footnotes in USB doc */
389 | VS_KEY_INTERNATIONAL2 = 136,
390 | VS_KEY_INTERNATIONAL3 = 137, /**< Yen */
391 | VS_KEY_INTERNATIONAL4 = 138,
392 | VS_KEY_INTERNATIONAL5 = 139,
393 | VS_KEY_INTERNATIONAL6 = 140,
394 | VS_KEY_INTERNATIONAL7 = 141,
395 | VS_KEY_INTERNATIONAL8 = 142,
396 | VS_KEY_INTERNATIONAL9 = 143,
397 | VS_KEY_LANG1 = 144, /**< Hangul/English toggle */
398 | VS_KEY_LANG2 = 145, /**< Hanja conversion */
399 | VS_KEY_LANG3 = 146, /**< Katakana */
400 | VS_KEY_LANG4 = 147, /**< Hiragana */
401 | VS_KEY_LANG5 = 148, /**< Zenkaku/Hankaku */
402 | VS_KEY_LANG6 = 149, /**< reserved */
403 | VS_KEY_LANG7 = 150, /**< reserved */
404 | VS_KEY_LANG8 = 151, /**< reserved */
405 | VS_KEY_LANG9 = 152, /**< reserved */
406 |
407 | VS_KEY_ALTERASE = 153, /**< Erase-Eaze */
408 | VS_KEY_SYSREQ = 154,
409 | VS_KEY_CANCEL = 155,
410 | VS_KEY_CLEAR = 156,
411 | VS_KEY_PRIOR = 157,
412 | VS_KEY_RETURN2 = 158,
413 | VS_KEY_SEPARATOR = 159,
414 | VS_KEY_OUT = 160,
415 | VS_KEY_OPER = 161,
416 | VS_KEY_CLEARAGAIN = 162,
417 | VS_KEY_CRSEL = 163,
418 | VS_KEY_EXSEL = 164,
419 |
420 | VS_KEY_KP_00 = 176,
421 | VS_KEY_KP_000 = 177,
422 | VS_KEY_THOUSANDSSEPARATOR = 178,
423 | VS_KEY_DECIMALSEPARATOR = 179,
424 | VS_KEY_CURRENCYUNIT = 180,
425 | VS_KEY_CURRENCYSUBUNIT = 181,
426 | VS_KEY_KP_LEFTPAREN = 182,
427 | VS_KEY_KP_RIGHTPAREN = 183,
428 | VS_KEY_KP_LEFTBRACE = 184,
429 | VS_KEY_KP_RIGHTBRACE = 185,
430 | VS_KEY_KP_TAB = 186,
431 | VS_KEY_KP_BACKSPACE = 187,
432 | VS_KEY_KP_A = 188,
433 | VS_KEY_KP_B = 189,
434 | VS_KEY_KP_C = 190,
435 | VS_KEY_KP_D = 191,
436 | VS_KEY_KP_E = 192,
437 | VS_KEY_KP_F = 193,
438 | VS_KEY_KP_XOR = 194,
439 | VS_KEY_KP_POWER = 195,
440 | VS_KEY_KP_PERCENT = 196,
441 | VS_KEY_KP_LESS = 197,
442 | VS_KEY_KP_GREATER = 198,
443 | VS_KEY_KP_AMPERSAND = 199,
444 | VS_KEY_KP_DBLAMPERSAND = 200,
445 | VS_KEY_KP_VERTICALBAR = 201,
446 | VS_KEY_KP_DBLVERTICALBAR = 202,
447 | VS_KEY_KP_COLON = 203,
448 | VS_KEY_KP_HASH = 204,
449 | VS_KEY_KP_SPACE = 205,
450 | VS_KEY_KP_AT = 206,
451 | VS_KEY_KP_EXCLAM = 207,
452 | VS_KEY_KP_MEMSTORE = 208,
453 | VS_KEY_KP_MEMRECALL = 209,
454 | VS_KEY_KP_MEMCLEAR = 210,
455 | VS_KEY_KP_MEMADD = 211,
456 | VS_KEY_KP_MEMSUBTRACT = 212,
457 | VS_KEY_KP_MEMMULTIPLY = 213,
458 | VS_KEY_KP_MEMDIVIDE = 214,
459 | VS_KEY_KP_PLUSMINUS = 215,
460 | VS_KEY_KP_CLEAR = 216,
461 | VS_KEY_KP_CLEARENTRY = 217,
462 | VS_KEY_KP_BINARY = 218,
463 | VS_KEY_KP_OCTAL = 219,
464 | VS_KEY_KP_DECIMAL = 220,
465 | VS_KEY_KP_HEXADECIMAL = 221,
466 |
467 | VS_KEY_LCTRL = 224,
468 | VS_KEY_LSHIFT = 225,
469 | VS_KEY_LALT = 226, /**< alt, option */
470 | VS_KEY_LGUI = 227, /**< windows, command (apple), meta */
471 | VS_KEY_RCTRL = 228,
472 | VS_KEY_RSHIFT = 229,
473 | VS_KEY_RALT = 230, /**< alt gr, option */
474 | VS_KEY_RGUI = 231, /**< windows, command (apple), meta */
475 |
476 | VS_KEY_MODE = 257, /**< I'm not sure if this is really not covered
477 | * by any of the above, but since there's a
478 | * special KMOD_MODE for it I'm adding it here
479 | */
480 |
481 | /* @} *//* Usage page 0x07 */
482 |
483 | /**
484 | * \name Usage page 0x0C
485 | *
486 | * These values are mapped from usage page 0x0C (USB consumer page).
487 | */
488 | /* @{ */
489 |
490 | VS_KEY_AUDIONEXT = 258,
491 | VS_KEY_AUDIOPREV = 259,
492 | VS_KEY_AUDIOSTOP = 260,
493 | VS_KEY_AUDIOPLAY = 261,
494 | VS_KEY_AUDIOMUTE = 262,
495 | VS_KEY_MEDIASELECT = 263,
496 | VS_KEY_WWW = 264,
497 | VS_KEY_MAIL = 265,
498 | VS_KEY_CALCULATOR = 266,
499 | VS_KEY_COMPUTER = 267,
500 | VS_KEY_AC_SEARCH = 268,
501 | VS_KEY_AC_HOME = 269,
502 | VS_KEY_AC_BACK = 270,
503 | VS_KEY_AC_FORWARD = 271,
504 | VS_KEY_AC_STOP = 272,
505 | VS_KEY_AC_REFRESH = 273,
506 | VS_KEY_AC_BOOKMARKS = 274,
507 |
508 | /* @} *//* Usage page 0x0C */
509 |
510 | /**
511 | * \name Walther keys
512 | *
513 | * These are values that Christian Walther added (for mac keyboard?).
514 | */
515 | /* @{ */
516 |
517 | VS_KEY_BRIGHTNESSDOWN = 275,
518 | VS_KEY_BRIGHTNESSUP = 276,
519 | VS_KEY_DISPLAYSWITCH = 277, /**< display mirroring/dual display
520 | switch, video mode switch */
521 | VS_KEY_KBDILLUMTOGGLE = 278,
522 | VS_KEY_KBDILLUMDOWN = 279,
523 | VS_KEY_KBDILLUMUP = 280,
524 | VS_KEY_EJECT = 281,
525 | VS_KEY_SLEEP = 282,
526 |
527 | VS_KEY_APP1 = 283,
528 | VS_KEY_APP2 = 284,
529 |
530 | /* @} *//* Walther keys */
531 |
532 | /* Add any other keys here. */
533 |
534 | VS_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes
535 | for array bounds */
536 | };
537 |
538 | //Mouse buttons
539 | #define VS_BTN_LEFT 1
540 | #define VS_BTN_MIDDLE 2
541 | #define VS_BTN_RIGHT 3
542 |
543 |
544 |
545 | #ifdef VS_EXPORT_SYSTEM
546 |
547 | ////////////////////////////////////////////////////////////
548 | /// VSSYSTEM
549 | ////////////////////////////////////////////////////////////
550 |
551 | ////////////////////////////////////////////////////////////
552 | /// \brief Initialize the library and create a window
553 | /// with opengl context
554 | ///
555 | ////////////////////////////////////////////////////////////
556 | VSSYSTEM_API int vsSystemInit(const char* title, int w, int h, int fps, int style);
557 |
558 | ////////////////////////////////////////////////////////////
559 | /// \brief Poll events, must be called once per frame.
560 | /// Update key and mouse states and update elapsed time
561 | ///
562 | ////////////////////////////////////////////////////////////
563 | VSSYSTEM_API void vsSystemPollEvents();
564 |
565 | ////////////////////////////////////////////////////////////
566 | /// \brief Bind a function to the mouse moved event
567 | ///
568 | ////////////////////////////////////////////////////////////
569 | VSSYSTEM_API void vsSystemBindEventMouseMoved(void(*mouseMoved)(int x, int y));
570 |
571 | ////////////////////////////////////////////////////////////
572 | /// \brief Bind a function to the mouse click event
573 | ///
574 | ////////////////////////////////////////////////////////////
575 | VSSYSTEM_API void vsSystemBindEventMouseClick(void(*mouseClick)(int btn));
576 |
577 | ////////////////////////////////////////////////////////////
578 | /// \brief Bind a function to the key press event
579 | ///
580 | ////////////////////////////////////////////////////////////
581 | VSSYSTEM_API void vsSystemBindEventKeyPress(void(*keyPress)(int key));
582 |
583 | ////////////////////////////////////////////////////////////
584 | /// \brief Bind a function to the quit event
585 | ///
586 | ////////////////////////////////////////////////////////////
587 | VSSYSTEM_API void vsSystemBindEventQuit(void(*quit)());
588 |
589 | ////////////////////////////////////////////////////////////
590 | /// \brief Unbind all the callbacks
591 | ///
592 | ////////////////////////////////////////////////////////////
593 | VSSYSTEM_API void vsSystemUnbindAll();
594 |
595 | ////////////////////////////////////////////////////////////
596 | /// \brief Destroy the library
597 | ///
598 | ////////////////////////////////////////////////////////////
599 | VSSYSTEM_API void vsSystemDestroy();
600 |
601 | #endif //VS_EXPORT_SYSTEM
602 |
603 |
604 |
605 | #ifdef VS_EXPORT_WINDOW
606 |
607 | ////////////////////////////////////////////////////////////
608 | /// WINDOW
609 | ////////////////////////////////////////////////////////////
610 |
611 | ////////////////////////////////////////////////////////////
612 | /// \brief Swap window buffers
613 | ///
614 | ////////////////////////////////////////////////////////////
615 | VSSYSTEM_API void vsWindowSwapBuffers();
616 |
617 | ////////////////////////////////////////////////////////////
618 | /// \brief Set window title
619 | ///
620 | ////////////////////////////////////////////////////////////
621 | VSSYSTEM_API void vsWindowSetTitle(const char* title);
622 |
623 | ////////////////////////////////////////////////////////////
624 | /// \brief Set window size
625 | ///
626 | ////////////////////////////////////////////////////////////
627 | VSSYSTEM_API void vsWindowSetSize(int w, int h);
628 |
629 | ////////////////////////////////////////////////////////////
630 | /// \brief Close the window, vsWindowIsOpen will return 0
631 | ///
632 | ////////////////////////////////////////////////////////////
633 | VSSYSTEM_API void vsWindowClose();
634 |
635 | ////////////////////////////////////////////////////////////
636 | /// \brief Get window title
637 | ///
638 | ////////////////////////////////////////////////////////////
639 | VSSYSTEM_API const char* vsWindowGetTitle();
640 |
641 | ////////////////////////////////////////////////////////////
642 | /// \brief Get window Width
643 | ///
644 | ////////////////////////////////////////////////////////////
645 | VSSYSTEM_API int vsWindowGetWidth();
646 |
647 | ////////////////////////////////////////////////////////////
648 | /// \brief Get window height
649 | ///
650 | ////////////////////////////////////////////////////////////
651 | VSSYSTEM_API int vsWindowGetHeight();
652 |
653 | ////////////////////////////////////////////////////////////
654 | /// \brief Verify if the window is open
655 | ///
656 | ////////////////////////////////////////////////////////////
657 | VSSYSTEM_API int vsWindowIsOpen();
658 |
659 | ////////////////////////////////////////////////////////////
660 | /// \brief Get window style
661 | ///
662 | ////////////////////////////////////////////////////////////
663 | VSSYSTEM_API int vsWindowGetStyle();
664 |
665 | #endif //VS_EXPORT_WINDOW
666 |
667 |
668 |
669 | #ifdef VS_EXPORT_TIME
670 |
671 | ////////////////////////////////////////////////////////////
672 | /// TIME
673 | ////////////////////////////////////////////////////////////
674 |
675 | ////////////////////////////////////////////////////////////
676 | /// \brief Get time in milliseconds from the start of the
677 | /// program
678 | ///
679 | ////////////////////////////////////////////////////////////
680 | VSSYSTEM_API double vsTimeGetFromStart();
681 |
682 | ////////////////////////////////////////////////////////////
683 | /// \brief Get elapsed time between frames in milliseconds
684 | ///
685 | ////////////////////////////////////////////////////////////
686 | VSSYSTEM_API double vsTimeGetElapsed();
687 |
688 | ////////////////////////////////////////////////////////////
689 | /// \brief Sleep for X ammount of time, in milliseconds
690 | ///
691 | ////////////////////////////////////////////////////////////
692 | VSSYSTEM_API void vsTimeSleep(double millisecs);
693 |
694 | #endif //VS_EXPORT_TIME
695 |
696 |
697 |
698 | #ifdef VS_EXPORT_KEY
699 |
700 | ////////////////////////////////////////////////////////////
701 | /// KEY
702 | ////////////////////////////////////////////////////////////
703 |
704 | ////////////////////////////////////////////////////////////
705 | /// \brief Get key state (released, pressed, down)
706 | ///
707 | ////////////////////////////////////////////////////////////
708 | VSSYSTEM_API int vsKeyGetState(int key);
709 |
710 | #endif //VS_ESPORT_KEY
711 |
712 |
713 |
714 | #ifdef VS_EXPORT_MOUSE
715 |
716 | ////////////////////////////////////////////////////////////
717 | /// MOUSE
718 | ////////////////////////////////////////////////////////////
719 |
720 | ////////////////////////////////////////////////////////////
721 | /// \brief Get mouse button state (released, pressed, down)
722 | ///
723 | ////////////////////////////////////////////////////////////
724 | VSSYSTEM_API int vsMouseGetState(int button);
725 |
726 | ////////////////////////////////////////////////////////////
727 | /// \brief Get mouse x position in the window
728 | ///
729 | ////////////////////////////////////////////////////////////
730 | VSSYSTEM_API int vsMouseGetX();
731 |
732 | ////////////////////////////////////////////////////////////
733 | /// \brief Get mouse y position in the window
734 | ///
735 | ////////////////////////////////////////////////////////////
736 | VSSYSTEM_API int vsMouseGetY();
737 |
738 | #endif //VS_EXPORT_MOUSE
739 |
740 | #ifdef __cplusplus
741 | } //extern C
742 | #endif
743 |
744 | #endif //VS_SYSTEM_H
745 |
746 |
747 |
748 | ////////////////////////////////////////////////////////////
749 | /// IMPLEMENTATION
750 | ////////////////////////////////////////////////////////////
751 | #if defined(VS_SYSTEM_IMPLEMENTATION)
752 |
753 | ////////////////////////////////////////////////////////////
754 | /// INCLUDES
755 | ////////////////////////////////////////////////////////////
756 | #include
757 |
758 |
759 |
760 | ////////////////////////////////////////////////////////////
761 | /// LOG
762 | ////////////////////////////////////////////////////////////
763 | #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
764 | #define ERROR(msg) printf("[ERROR] in %s l%d: %s\n", __FILENAME__, __LINE__, msg)
765 |
766 |
767 |
768 | ////////////////////////////////////////////////////////////
769 | /// GLOBAL DATA
770 | ////////////////////////////////////////////////////////////
771 | SDL_Window* window = NULL;
772 | SDL_GLContext glcontext = NULL;
773 | double elapsed_time = 16.6;
774 | double old_time = 0;
775 | int winwidth = 0;
776 | int winheight = 0;
777 | int winstyle = 0;
778 | int winopen = 0;
779 | const unsigned char* keys;
780 | void(*mouseMovedEvent)(int x, int y) = NULL;
781 | void(*mouseClickEvent)(int btn) = NULL;
782 | void(*keyPressEvent)(int key) = NULL;
783 | void(*quitEvent)() = NULL;
784 |
785 |
786 |
787 | ////////////////////////////////////////////////////////////
788 | /// SYSTEM
789 | ////////////////////////////////////////////////////////////
790 |
791 | ////////////////////////////////////////////////////////////
792 | int vsSystemInit(const char* title, int w, int h, int fps, int style)
793 | {
794 | //Initialize SDL
795 | if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_EVENTS) < 0) {
796 | ERROR("can't initialize SDL2 libray");
797 | return VS_FALSE;
798 | }
799 |
800 | //Shortcut
801 | #define CHECK_BITMASK(var, mask) ((var & mask) == mask) ? 1 : 0
802 |
803 | //Create window
804 | if (CHECK_BITMASK(style, VS_WINSTYLE_HIDDEN)) winstyle |= SDL_WINDOW_HIDDEN;
805 | if (CHECK_BITMASK(style, VS_WINSTYLE_RESIZABLE)) winstyle |= SDL_WINDOW_RESIZABLE;
806 | if (CHECK_BITMASK(style, VS_WINSTYLE_FULLSCREEN)) winstyle |= SDL_WINDOW_FULLSCREEN;
807 | if (CHECK_BITMASK(style, VS_WINSTYLE_ALLOW_HIGHDPI)) winstyle |= SDL_WINDOW_ALLOW_HIGHDPI;
808 | winstyle |= SDL_WINDOW_OPENGL;
809 | winwidth = w;
810 | winheight = h;
811 | winopen = VS_TRUE;
812 | window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
813 | w, h, winstyle);
814 | if (!window) {
815 | ERROR("can't create the window");
816 | return VS_FALSE;
817 | }
818 |
819 | //Create opengl context
820 | SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8);
821 | SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8);
822 | SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8);
823 | SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 0);
824 | SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1);
825 | glcontext = SDL_GL_CreateContext(window);
826 | SDL_GL_SetSwapInterval(fps);
827 |
828 | //Get key state address
829 | keys = SDL_GetKeyboardState(NULL);
830 |
831 | return VS_TRUE;
832 | }
833 |
834 | ////////////////////////////////////////////////////////////
835 | void vsSystemPollEvents()
836 | {
837 | //Update time
838 | elapsed_time = SDL_GetTicks() - old_time;
839 | old_time = SDL_GetTicks();
840 |
841 | SDL_Event ev;
842 | while (SDL_PollEvent(&ev)) {
843 | switch (ev.type) {
844 | case SDL_MOUSEMOTION:
845 | if (mouseMovedEvent) mouseMovedEvent(ev.motion.x, ev.motion.y);
846 | break;
847 |
848 | case SDL_MOUSEBUTTONDOWN:
849 | if (mouseClickEvent) mouseClickEvent(ev.button.button);
850 | break;
851 |
852 | case SDL_KEYDOWN:
853 | if (keyPressEvent) keyPressEvent(ev.key.keysym.scancode);
854 | break;
855 |
856 | case SDL_QUIT:
857 | if (quitEvent) quitEvent();
858 | break;
859 | }
860 | }
861 | }
862 |
863 | ////////////////////////////////////////////////////////////
864 | void vsSystemBindEventMouseMoved(void(*mouseMoved)(int x, int y))
865 | {
866 | mouseMovedEvent = mouseMoved;
867 | }
868 |
869 | ////////////////////////////////////////////////////////////
870 | void vsSystemBindEventMouseClick(void(*mouseClick)(int btn))
871 | {
872 | mouseClickEvent = mouseClick;
873 | }
874 |
875 | ////////////////////////////////////////////////////////////
876 | void vsSystemBindEventKeyPress(void(*keyPress)(int key))
877 | {
878 | keyPressEvent = keyPress;
879 | }
880 |
881 | ////////////////////////////////////////////////////////////
882 | void vsSystemBindEventQuit(void(*quit)())
883 | {
884 | quitEvent = quit;
885 | }
886 |
887 | ////////////////////////////////////////////////////////////
888 | void vsSystemUnbindAll()
889 | {
890 | mouseMovedEvent = NULL;
891 | mouseClickEvent = NULL;
892 | keyPressEvent = NULL;
893 | quitEvent = NULL;
894 | }
895 |
896 | ////////////////////////////////////////////////////////////
897 | void vsSystemDestroy()
898 | {
899 | //Destroy opengl context
900 | SDL_GL_DeleteContext(glcontext);
901 |
902 | //Destroy window
903 | SDL_DestroyWindow(window);
904 |
905 | //Quit SDL
906 | SDL_Quit();
907 | }
908 |
909 |
910 |
911 | ////////////////////////////////////////////////////////////
912 | /// WINDOW
913 | ////////////////////////////////////////////////////////////
914 |
915 | ////////////////////////////////////////////////////////////
916 | void vsWindowSwapBuffers()
917 | {
918 | SDL_GL_SwapWindow(window);
919 | }
920 |
921 | ////////////////////////////////////////////////////////////
922 | void vsWindowSetTitle(const char* title)
923 | {
924 | SDL_SetWindowTitle(window, title);
925 | }
926 |
927 | ////////////////////////////////////////////////////////////
928 | void vsWindowSetSize(int w, int h)
929 | {
930 | SDL_SetWindowSize(window, w, h);
931 | winwidth = w;
932 | winheight = h;
933 | }
934 |
935 | ////////////////////////////////////////////////////////////
936 | void vsWindowClose()
937 | {
938 | winopen = VS_FALSE;
939 | }
940 |
941 | ////////////////////////////////////////////////////////////
942 | const char* vsWindowGetTitle()
943 | {
944 | return SDL_GetWindowTitle(window);
945 | }
946 |
947 | ////////////////////////////////////////////////////////////
948 | int vsWindowGetWidth()
949 | {
950 | return winwidth;
951 | }
952 |
953 | ////////////////////////////////////////////////////////////
954 | int vsWindowGetHeight()
955 | {
956 | return winheight;
957 | }
958 |
959 | ////////////////////////////////////////////////////////////
960 | int vsWindowIsOpen()
961 | {
962 | return winopen;
963 | }
964 |
965 | ////////////////////////////////////////////////////////////
966 | int vsWindowGetStyle()
967 | {
968 | return winstyle;
969 | }
970 |
971 |
972 |
973 | ////////////////////////////////////////////////////////////
974 | /// TIME
975 | ////////////////////////////////////////////////////////////
976 |
977 | ////////////////////////////////////////////////////////////
978 | double vsTimeGetFromStart()
979 | {
980 | return SDL_GetTicks();
981 | }
982 |
983 | ////////////////////////////////////////////////////////////
984 | double vsTimeGetElapsed()
985 | {
986 | return elapsed_time;
987 | }
988 |
989 | ////////////////////////////////////////////////////////////
990 | void vsTimeSleep(double millisecs)
991 | {
992 | SDL_Delay(millisecs);
993 | }
994 |
995 |
996 |
997 | ////////////////////////////////////////////////////////////
998 | /// KEY
999 | ////////////////////////////////////////////////////////////
1000 |
1001 | ////////////////////////////////////////////////////////////
1002 | int vsKeyGetState(int key)
1003 | {
1004 | return keys[key];
1005 | }
1006 |
1007 |
1008 |
1009 | ////////////////////////////////////////////////////////////
1010 | /// MOUSE
1011 | ////////////////////////////////////////////////////////////
1012 |
1013 | ////////////////////////////////////////////////////////////
1014 | int vsMouseGetState(int button)
1015 | {
1016 | unsigned int bitmask = SDL_GetMouseState(NULL, NULL);
1017 | switch (button)
1018 | {
1019 | case VS_BTN_LEFT: return (bitmask & SDL_BUTTON(SDL_BUTTON_LEFT));
1020 | case VS_BTN_MIDDLE: return (bitmask & SDL_BUTTON(SDL_BUTTON_MIDDLE));
1021 | case VS_BTN_RIGHT: return (bitmask & SDL_BUTTON(SDL_BUTTON_RIGHT));
1022 | default: return 0;
1023 | }
1024 | }
1025 |
1026 | ////////////////////////////////////////////////////////////
1027 | int vsMouseGetX()
1028 | {
1029 | int x;
1030 | SDL_GetMouseState(&x, NULL);
1031 | return x;
1032 | }
1033 | ////////////////////////////////////////////////////////////
1034 | int vsMouseGetY()
1035 | {
1036 | int y;
1037 | SDL_GetMouseState(NULL, &y);
1038 | return y;
1039 | }
1040 |
1041 | #endif //VS_SYSTEM_IMPLEMENTATION
1042 |
--------------------------------------------------------------------------------
/src/brain.c:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2015 Carlo Meroni
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
23 | ================================================================= */
24 |
25 | ////////////////////////////////////////////////////////////
26 | /// INCLUDES
27 | ////////////////////////////////////////////////////////////
28 | #include
29 | #include
30 | #include
31 | #include "brain.h"
32 |
33 |
34 |
35 | ////////////////////////////////////////////////////////////
36 | /// CONSTANTS
37 | ////////////////////////////////////////////////////////////
38 | #define RANDF() (double)rand() / RAND_MAX
39 | #define NEURON_THRESHOLD 30
40 |
41 |
42 |
43 | ////////////////////////////////////////////////////////////
44 | /// NEURON
45 | ////////////////////////////////////////////////////////////
46 |
47 | ////////////////////////////////////////////////////////////
48 | neuron* neuron_init(brain* b, long id)
49 | {
50 | neuron* n = (neuron*)malloc(sizeof(neuron));
51 | n->b = b;
52 | n->id = id;
53 | n->links = (long*)malloc(sizeof(long) * 2);
54 | n->weights = (int*)malloc(sizeof(int) * 2);
55 | n->links_capacity = 2;
56 | n->links_count = 0;
57 | n->state = 0;
58 | n->nextstate = 0;
59 | n->fired = 0;
60 | return n;
61 | }
62 |
63 | ////////////////////////////////////////////////////////////
64 | void neuron_free(neuron* n)
65 | {
66 | if (n->links) free(n->links);
67 | if (n->weights) free(n->weights);
68 | free(n);
69 | }
70 |
71 | ////////////////////////////////////////////////////////////
72 | void neuron_link(neuron* n, neuron* other, int weight)
73 | {
74 | if (n->links_count >= n->links_capacity) {
75 | n->links_capacity*=2;
76 | n->links = (long*)realloc(n->links, sizeof(long) * n->links_capacity);
77 | n->weights = (int*)realloc(n->weights, sizeof(int) * n->links_capacity);
78 | }
79 |
80 | n->links[n->links_count] = other->id;
81 | n->weights[n->links_count] = weight;
82 | n->links_count++;
83 | }
84 |
85 | ////////////////////////////////////////////////////////////
86 | void neuron_unlink(neuron* n, long other_id)
87 | {
88 | int found = 0;
89 | for (int i = 0; i < n->links_count-1; i++) {
90 | if (n->links[i] == other_id) found = 1;
91 | if (found) {
92 | n->links[i] = n->links[i+1];
93 | n->weights[i] = n->weights[i+1];
94 | }
95 | }
96 | if (found) n->links_count--;
97 | }
98 |
99 | ////////////////////////////////////////////////////////////
100 | void neuron_update(neuron* n)
101 | {
102 | //Fire
103 | if (n->state >= NEURON_THRESHOLD)
104 | {
105 | //Send weights to other neurons
106 | for (int i = 0; i < n->links_count; i++)
107 | n->b->neurons[n->links[i]]->nextstate += n->weights[i];
108 | n->nextstate = 0;
109 | n->state = 0;
110 | n->fired = 1;
111 | }
112 | else
113 | {
114 | n->fired = 0;
115 | }
116 |
117 | //Update state
118 | n->state += n->nextstate;
119 | n->nextstate = 0;
120 | }
121 |
122 | ////////////////////////////////////////////////////////////
123 | void neuron_fire(neuron* n)
124 | {
125 | n->state = NEURON_THRESHOLD;
126 | }
127 |
128 | ////////////////////////////////////////////////////////////
129 | int neuron_fired(neuron* n)
130 | {
131 | return n->fired;
132 | }
133 |
134 |
135 | ////////////////////////////////////////////////////////////
136 | /// BRAIN
137 | ////////////////////////////////////////////////////////////
138 |
139 | ////////////////////////////////////////////////////////////
140 | brain* brain_init()
141 | {
142 | brain* b = (brain*)malloc(sizeof(brain));
143 | b->neurons = NULL;
144 | b->neurons_count = 0;
145 | return b;
146 | }
147 |
148 | ////////////////////////////////////////////////////////////
149 | void brain_free(brain* b)
150 | {
151 | if (b->neurons) {
152 | for (int i = 0; i < b->neurons_count; i++)
153 | neuron_free(b->neurons[i]);
154 | free(b->neurons);
155 | b->neurons = NULL;
156 | }
157 | free(b);
158 | b = NULL;
159 | }
160 |
161 | ////////////////////////////////////////////////////////////
162 | void brain_makeneurons(brain* b, int neurons_count)
163 | {
164 | //Free old neurons
165 | if (b->neurons) {
166 | for (int i = 0; i < b->neurons_count; i++)
167 | neuron_free(b->neurons[i]);
168 | free(b->neurons);
169 | b->neurons = NULL;
170 | }
171 |
172 | //Make new neurons
173 | b->neurons = (neuron**)malloc(sizeof(neuron*) * neurons_count);
174 | b->neurons_count = neurons_count;
175 | for (int i = 0; i < b->neurons_count; i++)
176 | b->neurons[i] = neuron_init(b, i);
177 | }
178 |
179 | ////////////////////////////////////////////////////////////
180 | void brain_update(brain* b)
181 | {
182 | //Update all neurons
183 | for (int i = 0; i < b->neurons_count; i++)
184 | neuron_update(b->neurons[i]);
185 | }
186 |
--------------------------------------------------------------------------------
/src/brain.h:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | The MIT License (MIT)
3 |
4 | Copyright (c) 2015 Carlo Meroni
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
23 | ================================================================= */
24 |
25 | ////////////////////////////////////////////////////////////
26 | /// HEADER
27 | ////////////////////////////////////////////////////////////
28 | #ifndef BRAIN_H
29 | #define BRAIN_H
30 |
31 | #ifdef __cplusplus
32 | extern "C" {
33 | #endif
34 |
35 | typedef struct neuron neuron;
36 | typedef struct brain brain;
37 |
38 | ////////////////////////////////////////////////////////////
39 | /// NEURON
40 | ////////////////////////////////////////////////////////////
41 | typedef struct neuron
42 | {
43 | brain* b;
44 | long id;
45 | long* links;
46 | int links_count;
47 | int links_capacity;
48 | int* weights;
49 | float state;
50 | float nextstate;
51 | int fired;
52 | } neuron;
53 |
54 | ////////////////////////////////////////////////////////////
55 | /// \brief Initialize neuron
56 | ///
57 | ////////////////////////////////////////////////////////////
58 | neuron* neuron_init(brain* b, long id);
59 |
60 | ////////////////////////////////////////////////////////////
61 | /// \brief Free neuron
62 | ///
63 | ////////////////////////////////////////////////////////////
64 | void neuron_free(neuron* n);
65 |
66 | ////////////////////////////////////////////////////////////
67 | /// \brief Link two neurons
68 | ///
69 | ////////////////////////////////////////////////////////////
70 | void neuron_link(neuron* n, neuron* other, int weight);
71 |
72 | ////////////////////////////////////////////////////////////
73 | /// \brief Unlink a neuron from id
74 | ///
75 | ////////////////////////////////////////////////////////////
76 | void neuron_unlink(neuron* n, long other_id);
77 |
78 | ////////////////////////////////////////////////////////////
79 | /// \brief Update neuron states
80 | ///
81 | ////////////////////////////////////////////////////////////
82 | void neuron_update(neuron* n);
83 |
84 | ////////////////////////////////////////////////////////////
85 | /// \brief Fire!
86 | ///
87 | ////////////////////////////////////////////////////////////
88 | void neuron_fire(neuron* n);
89 |
90 | ////////////////////////////////////////////////////////////
91 | /// \brief Check if the neuron fired
92 | ///
93 | ////////////////////////////////////////////////////////////
94 | int neuron_fired(neuron* n);
95 |
96 |
97 | ////////////////////////////////////////////////////////////
98 | /// BRAIN
99 | ////////////////////////////////////////////////////////////
100 | typedef struct brain
101 | {
102 | neuron** neurons;
103 | int neurons_count;
104 | } brain;
105 |
106 | ////////////////////////////////////////////////////////////
107 | /// \brief Initialize brain
108 | ///
109 | ////////////////////////////////////////////////////////////
110 | brain* brain_init();
111 |
112 | ////////////////////////////////////////////////////////////
113 | /// \brief Free brain
114 | ///
115 | ////////////////////////////////////////////////////////////
116 | void brain_free(brain* b);
117 |
118 | ////////////////////////////////////////////////////////////
119 | /// \brief Allocate in the brain N neurons
120 | ///
121 | ////////////////////////////////////////////////////////////
122 | void brain_makeneurons(brain* b, int neurons_count);
123 |
124 | ////////////////////////////////////////////////////////////
125 | /// \brief Update neurons states
126 | ///
127 | ////////////////////////////////////////////////////////////
128 | void brain_update(brain* b);
129 |
130 | #ifdef __cplusplus
131 | } //EXTERN C
132 | #endif
133 |
134 | #endif //BRAIN_H
135 |
--------------------------------------------------------------------------------
/src/main.c:
--------------------------------------------------------------------------------
1 | ////////////////////////////////////////////////////////////
2 | /// INCLUDES
3 | ////////////////////////////////////////////////////////////
4 | #include "Celegans.h"
5 | #include "brain.h"
6 | #include
7 | #define VS_SYSTEM_IMPLEMENTATION
8 | #define VS_GRAPHICS_IMPLEMENTATION
9 | #include "VSSystem.h"
10 | #include "VSGraphics.h"
11 |
12 |
13 | ////////////////////////////////////////////////////////////
14 | /// CONSTANTS
15 | ////////////////////////////////////////////////////////////
16 | #define WINDOW_WIDTH 1100.0
17 | #define WINDOW_HEIGHT 700.0
18 | #define BODY_WIDTH 64.0
19 | #define BODY_HEIGHT 32.0
20 | #define RADIAS_TO_DEGREE 57.2957
21 |
22 |
23 | ////////////////////////////////////////////////////////////
24 | /// C.ELEGANS
25 | ////////////////////////////////////////////////////////////
26 | typedef struct Celegans
27 | {
28 | brain* soul;
29 | vsSprite body;
30 | } Celegans;
31 |
32 | Celegans* Celegans_init()
33 | {
34 | Celegans* ce = (Celegans*)malloc(sizeof(Celegans));
35 | ce->soul = Celegans_brain_init();
36 | ce->body.texture = NULL;
37 | ce->body.origin = VSVECTOR2(BODY_WIDTH/2, BODY_HEIGHT/2);
38 | ce->body.position = VSVECTOR2(WINDOW_WIDTH/2, WINDOW_HEIGHT/2);
39 | ce->body.size = VSVECTOR2(BODY_WIDTH, BODY_HEIGHT);
40 | ce->body.rotation = 0;
41 | ce->body.color = VS_COLOR_GREEN;
42 | return ce;
43 | }
44 |
45 | void Celegans_free(Celegans* ce)
46 | {
47 | Celegans_brain_free(ce->soul);
48 | free(ce);
49 | }
50 |
51 | void Celegans_update(Celegans* ce)
52 | {
53 | int mvulva_id = Celegans_neuron_get_id("MVULVA");
54 | assert(mvulva_id != -1);
55 | int muscle_right_start_id = MUSCLE_RIGHT_START;
56 | int muscle_right_end_id = MUSCLE_RIGHT_END;
57 | int muscle_left_start_id = MUSCLE_LEFT_START;
58 | int muscle_left_end_id = MUSCLE_LEFT_END;
59 |
60 | ce->soul->neurons[mvulva_id]->state = 0;
61 |
62 | //Calculate right side muscle contraction
63 | int rightAcc = 0;
64 | for (int i = muscle_right_start_id; i < muscle_right_end_id; i++) {
65 | rightAcc += ce->soul->neurons[i]->state;
66 | ce->soul->neurons[i]->state *= 0.7; //Decrease the muscle contraction over time
67 | }
68 |
69 | //Calculate left side muscle contraction
70 | int leftAcc = 0;
71 | for (int i = muscle_left_start_id; i < muscle_left_end_id; i++) {
72 | leftAcc += ce->soul->neurons[i]->state;
73 | ce->soul->neurons[i]->state *= 0.7; //Decrease the muscle contraction over time
74 | }
75 |
76 | //Calculate speed based on muscle contraction
77 | float speed = leftAcc + rightAcc;
78 | speed = speed/200.0 * 3.0;
79 |
80 | //Adjust orientation and position based on muscle contraction
81 | if (rightAcc > leftAcc) ce->body.rotation -= 5;
82 | else if (leftAcc > rightAcc) ce->body.rotation += 5;
83 | float changex = cosf(ce->body.rotation / RADIAS_TO_DEGREE) * speed;
84 | float changey = sinf(ce->body.rotation / RADIAS_TO_DEGREE) * speed;
85 | ce->body.position.x += changex;
86 | ce->body.position.y += changey;
87 |
88 | //Update brain
89 | Celegans_brain_update(ce->soul);
90 | }
91 |
92 | void Celegans_draw(Celegans* ce)
93 | {
94 | vsRendererDrawSprite(&ce->body);
95 | }
96 |
97 |
98 | ////////////////////////////////////////////////////////////
99 | /// PROGRAM
100 | ////////////////////////////////////////////////////////////
101 |
102 | static int drawbraindata = 0;
103 |
104 | //Close application event
105 | void quit() {
106 | exit(0);
107 | }
108 |
109 | //Press key event
110 | void presskey(int key) {
111 | if (key == VS_KEY_S) drawbraindata = !drawbraindata;
112 | if (key == VS_KEY_Q) quit();
113 | }
114 |
115 | int main()
116 | {
117 | //Create C.elegans
118 | Celegans* ce = Celegans_init();
119 |
120 | //Initialize libraryes
121 | vsSystemInit("C. elegans simulation", WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0);
122 | vsSystemBindEventQuit(quit);
123 | vsSystemBindEventKeyPress(presskey);
124 | vsGraphicsInit();
125 |
126 | //Create the view
127 | vsViewCreate(VSRECT(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT),
128 | VSVECTOR2(WINDOW_WIDTH/2, WINDOW_HEIGHT/2),
129 | VSVECTOR2(WINDOW_WIDTH, WINDOW_HEIGHT), 0);
130 |
131 |
132 | //Application loop
133 | for (;;)
134 | {
135 | ////////////////////////////////////////////////////////////
136 | /// UPDATE
137 | ////////////////////////////////////////////////////////////
138 |
139 | //Update each neuron of the brain
140 | Celegans_update(ce);
141 |
142 | //Check window limits for collision detection
143 | int collision = 0;
144 | if (ce->body.position.x <= 0) {ce->body.position.x = 0; collision = 1;}
145 | if (ce->body.position.x >= WINDOW_WIDTH-BODY_HEIGHT) {ce->body.position.x = WINDOW_WIDTH-BODY_HEIGHT; collision = 1;}
146 | if (ce->body.position.y <= 0) {ce->body.position.y = 0; collision = 1;}
147 | if (ce->body.position.y >= WINDOW_HEIGHT-BODY_HEIGHT) {ce->body.position.y = WINDOW_HEIGHT-BODY_HEIGHT; collision = 1;}
148 | if (collision) Celegans_brain_touchnose(ce->soul); //Trigget nose neurons
149 |
150 | //Some manual controlls
151 | if (vsKeyGetState(VS_KEY_F)) Celegans_brain_givefood(ce->soul); //F = give food
152 | if (vsKeyGetState(VS_KEY_N)) Celegans_brain_touchnose(ce->soul); //N = touch nose
153 | if (vsKeyGetState(VS_KEY_A)) Celegans_brain_touchanterior(ce->soul); //A = touch anterior
154 | if (vsKeyGetState(VS_KEY_P)) Celegans_brain_touchposterior(ce->soul); //P = touch posterior
155 |
156 | ////////////////////////////////////////////////////////////
157 | /// DRAW
158 | ////////////////////////////////////////////////////////////
159 |
160 | //Clear the screen
161 | vsRendererClear();
162 |
163 | //Draw brain and muscle data on the screen
164 | if (drawbraindata)
165 | {
166 | int neuron_end = NEURON_END;
167 | int muscle_right_start_id = MUSCLE_RIGHT_START;
168 | int muscle_right_end_id = MUSCLE_RIGHT_END;
169 | int muscle_left_start_id = MUSCLE_LEFT_START;
170 | int muscle_left_end_id = MUSCLE_LEFT_END;
171 |
172 | //Draw neurons activity
173 | for (int i = 0; i < neuron_end; i++) {
174 | int x = i % 32;
175 | int y = i / 32.0;
176 | if (Celegans_brain_fired(ce->soul, i))
177 | vsRendererDrawRect(NULL, 0, 0, 0, 0, x * 16 + 1, y * 16 + 1, 16, 16, VS_COLOR_WHITE);
178 | }
179 |
180 | //Draw right side muscle activity
181 | for (int i = muscle_right_start_id; i < muscle_right_end_id; i++) {
182 | int x = i - muscle_right_start_id;
183 | int y = 200;
184 | if (ce->soul->neurons[i]->state > 0) vsRendererDrawRect(NULL, 0, 0, 0, 0, x * 8 + 1, y, 8, 8, VSCOLOR(255, 0, 0, (unsigned char)(ce->soul->neurons[i]->state * 8.2)));
185 | else vsRendererDrawRect(NULL, 0, 0, 0, 0, x * 8 + 1, y, 8, 8, VSCOLOR(0, 0, 255, (unsigned char)(ce->soul->neurons[i]->state * -8.2)));
186 | }
187 |
188 | //Draw left side muscle activity
189 | for (int i = muscle_left_start_id; i < muscle_left_end_id; i++) {
190 | int x = i - muscle_left_start_id;
191 | int y = 216;
192 | if (ce->soul->neurons[i]->state > 0) vsRendererDrawRect(NULL, 0, 0, 0, 0, x * 8 + 1, y, 8, 8, VSCOLOR(255, 0, 0, (unsigned char)(ce->soul->neurons[i]->state * 8.2)));
193 | else vsRendererDrawRect(NULL, 0, 0, 0, 0, x * 8 + 1, y, 8, 8, VSCOLOR(0, 0, 255, (unsigned char)(ce->soul->neurons[i]->state * -8.2)));
194 | }
195 | }
196 |
197 | //Draw the C.elegans body
198 | Celegans_draw(ce);
199 |
200 | //Draw
201 | vsRendererDisplay();
202 | vsWindowSwapBuffers();
203 |
204 | //Update events
205 | vsSystemPollEvents();
206 |
207 | usleep(8000);
208 | }
209 |
210 | //Close all the libraryes
211 | vsGraphicsDestroy();
212 | vsSystemDestroy();
213 |
214 | //Free brain
215 | Celegans_free(ce);
216 |
217 | return 0;
218 | }
219 |
--------------------------------------------------------------------------------