├── 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 | --------------------------------------------------------------------------------