├── README.md ├── demo ├── landscape │ ├── baked │ │ ├── NormalsTS.png │ │ └── landscape-details.obj │ ├── checker.png │ ├── index.html │ ├── input │ │ └── landscape-lowpoly-uv.obj │ └── tangents.x3d ├── lib │ ├── styles.css │ ├── x3dom.css │ └── x3dom.js └── victor │ ├── baked │ ├── NormalsTS.png │ └── victor-details.obj │ ├── checker.png │ ├── index.html │ ├── input │ └── victor-lowpoly-uv.obj │ └── tangents.x3d ├── images ├── landscape-details.jpg ├── landscape-normalmap.jpg ├── landscape-tangents.jpg ├── victor-details.jpg ├── victor-normalmap.jpg └── victor-tangents.jpg └── src ├── tgen.cpp ├── tgen.h ├── tgen_debug.cpp └── tgen_debug.h /README.md: -------------------------------------------------------------------------------- 1 | # TGen 2 | 3 | This is a very basic tangent generator, written in C++. 4 | The main purpose of this project is to facilitate adoption of, and discussion about, the proper setup of tangent spaces for glTF 2.0 assets. 5 | 6 | Current Features: 7 | * Generation of per-corner tangents for triangle data with UVs 8 | * Computation of per-wedge / per-UV-vertex tangent spaces 9 | * Tangent frame orthogonalization 10 | * Encoding of 4-component tangents (with "flip factor") for avoiding explicit binormals 11 | * Simple C++ implementation, no dependencies 12 | 13 | The code consists basically of one header + .cpp file. 14 | For debugging and visualization, there is also a simple X3D exporter in a separate file, which was used to generate the 3D visualizations shown below. 15 | The baked tangent-space normal maps are just provided for demonstration purposes, the actual baking code is not part of this repository. 16 | 17 | So far, the C++ code from this project has just been compiled and tested with VS 2015. 18 | 19 | Feedback and contributions are always welcome. 20 | 21 | 22 | ## Results 23 | 24 | These are some basic results - images show tangent frames, detail mesh, and resulting baked normal map. 25 | 26 | ### Landscape 27 |
28 | 29 | 30 | 31 |
32 | 33 | [Web Demo](https://mlimper.github.io/tgen/demo/landscape/index.html) 34 | 35 | 36 | ### Victor 37 |
38 | 39 | 40 | 41 |
42 | 43 | [Web Demo](https://mlimper.github.io/tgen/demo/victor/index.html) 44 | -------------------------------------------------------------------------------- /demo/landscape/baked/NormalsTS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/demo/landscape/baked/NormalsTS.png -------------------------------------------------------------------------------- /demo/landscape/checker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/demo/landscape/checker.png -------------------------------------------------------------------------------- /demo/landscape/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Tangent Frames 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /demo/landscape/input/landscape-lowpoly-uv.obj: -------------------------------------------------------------------------------- 1 | # 289 vertices, 512 faces 2 | v -1 0.024631 1 3 | vn -0.0772984 0.996524 0.0310676 4 | vt 0.0284156 0.9995 5 | v 1 0.009436 1 6 | vn 0.247663 0.955795 0.158489 7 | vt 0.00987357 0.000488281 8 | v -1 0.023023 -1 9 | vn -0.149127 0.985319 -0.0831087 10 | vt 0.987846 0.974639 11 | v 1 0 -1 12 | vn 0 1 0 13 | vt 0.982605 0.0118125 14 | v -1 0.006372 0 15 | vn -0.0794382 0.996491 0.0263595 16 | vt 0.510339 0.988344 17 | v 0 0.166517 1 18 | vn -0.157277 0.900502 0.405414 19 | vt 0.0035039 0.510435 20 | v 1 0.009436 0 21 | vn 0.169498 0.978091 -0.120865 22 | vt 0.503475 0.00765345 23 | v 0 0.057923 -1 24 | vn 0.14008 0.983834 -0.111574 25 | vt 0.984889 0.493605 26 | v 0 0.164948 0 27 | vn -0.12018 0.941372 -0.31524 28 | vt 0.499015 0.500032 29 | v -1 0.024631 0.5 30 | vn -0.07981 0.996069 -0.0384431 31 | vt 0.267573 0.993608 32 | v 0.5 0.142605 1 33 | vn 0.204485 0.887894 0.412103 34 | vt 0.00261001 0.250203 35 | v 1 0 -0.5 36 | vn 0 1 0 37 | vt 0.744824 0.0115953 38 | v -0.5 0.083436 -1 39 | vn -0.048349 0.986373 -0.157263 40 | vt 0.985259 0.7356 41 | v -1 0.038116 -0.5 42 | vn -0.172799 0.983986 0.0437198 43 | vt 0.750868 0.978768 44 | v -0.5 0.060024 1 45 | vn -0.157179 0.978272 0.135202 46 | vt 0.0186096 0.762382 47 | v 1 0.054098 0.5 48 | vn 0.40132 0.915821 -0.0146398 49 | vt 0.25373 0.00517788 50 | v 0.5 0.000854 -1 51 | vn 0.0314398 0.999446 -0.0109546 52 | vt 0.983852 0.250679 53 | v 0 0.083436 -0.5 54 | vn 0.158861 0.987174 0.0158239 55 | vt 0.743775 0.495575 56 | v 0 0.312113 0.5 57 | vn -0.280424 0.959473 -0.0278291 58 | vt 0.251965 0.498326 59 | v -0.5 0.056927 0 60 | vn -0.176891 0.984217 0.00507513 61 | vt 0.504305 0.746889 62 | v 0.5 0.142605 0 63 | vn 0.20538 0.895832 -0.394086 64 | vt 0.496876 0.256525 65 | v 0.5 0.292127 0.5 66 | vn 0.349688 0.936849 -0.00569821 67 | vt 0.250919 0.265874 68 | v -0.5 0.104774 0.5 69 | vn -0.346104 0.936533 -0.0558428 70 | vt 0.261301 0.75044 71 | v -0.5 0.116888 -0.5 72 | vn -0.0748209 0.994386 0.0748209 73 | vt 0.745068 0.736472 74 | v 0.5 0.004755 -0.5 75 | vn 0.0794203 0.996723 -0.0153239 76 | vt 0.744832 0.251502 77 | v -1 0.02991 0.75 78 | vn -0.0867454 0.99622 0.00458568 79 | vt 0.147762 0.995891 80 | v 0.75 0.071705 1 81 | vn 0.293871 0.90793 0.298837 82 | vt 0.00725816 0.122705 83 | v 1 0 -0.75 84 | vn 0 1 0 85 | vt 0.863695 0.0124214 86 | v -0.75 0.057923 -1 87 | vn -0.132616 0.983091 -0.12627 88 | vt 0.985956 0.85525 89 | v -1 0.023023 -0.25 90 | vn -0.126939 0.988262 0.0849938 91 | vt 0.631129 0.983372 92 | v -0.25 0.114455 1 93 | vn -0.243486 0.924425 0.293517 94 | vt 0.0103904 0.638926 95 | v 1 0.039197 0.25 96 | vn 0.33255 0.934793 -0.124792 97 | vt 0.379109 0.00597315 98 | v 0.25 0.023023 -1 99 | vn 0.129133 0.989709 -0.0616423 100 | vt 0.984635 0.371598 101 | v 0 0.083436 -0.75 102 | vn 0.165255 0.984622 -0.056651 103 | vt 0.864269 0.49503 104 | v 0 0.257377 0.25 105 | vn -0.238132 0.922094 -0.305019 106 | vt 0.372822 0.499507 107 | v -0.75 0.029816 0 108 | vn -0.095584 0.993137 0.067403 109 | vt 0.506862 0.867916 110 | v 0.25 0.176634 0 111 | vn 0.0474504 0.910497 -0.410784 112 | vt 0.496615 0.378753 113 | v -1 0.012366 0.25 114 | vn -0.0567978 0.996853 -0.0552975 115 | vt 0.388837 0.991725 116 | v 0.25 0.179257 1 117 | vn 0.0276251 0.889547 0.456008 118 | vt 0.000488281 0.380197 119 | v 1 0 -0.25 120 | vn 0.00306662 0.999991 -0.00306662 121 | vt 0.624891 0.00993725 122 | v -0.25 0.083436 -1 123 | vn 0.0689206 0.986225 -0.15037 124 | vt 0.985008 0.615147 125 | v -1 0.038116 -0.75 126 | vn -0.180141 0.983193 -0.0296722 127 | vt 0.869422 0.97563 128 | v -0.75 0.042694 1 129 | vn -0.0621168 0.997123 0.0434533 130 | vt 0.0251669 0.880676 131 | v 1 0.039197 0.75 132 | vn 0.366274 0.924513 0.105451 133 | vt 0.130248 0.00393842 134 | v 0.75 0 -1 135 | vn 0 1 0 136 | vt 0.982975 0.13111 137 | v 0 0.096844 -0.25 138 | vn 0.0310264 0.984462 -0.172834 139 | vt 0.622969 0.497563 140 | v 0 0.273312 0.75 141 | vn -0.218547 0.931064 0.292159 142 | vt 0.132328 0.501952 143 | v -0.25 0.115733 0 144 | vn -0.224666 0.960386 -0.164877 145 | vt 0.502123 0.623104 146 | v 0.75 0.071705 0 147 | vn 0.271471 0.923367 -0.271471 148 | vt 0.500384 0.131285 149 | v 0.5 0.246992 0.25 150 | vn 0.295636 0.908405 -0.295636 151 | vt 0.370113 0.262623 152 | v 0.5 0.246992 0.75 153 | vn 0.297289 0.909065 0.291923 154 | vt 0.131049 0.261913 155 | v 0.25 0.349963 0.5 156 | vn 0.0398284 0.999112 -0.0137421 157 | vt 0.250172 0.383175 158 | v 0.75 0.173112 0.5 159 | vn 0.449475 0.89328 -0.00472965 160 | vt 0.253166 0.13693 161 | v -0.5 0.073931 0.25 162 | vn -0.301733 0.947236 -0.108172 163 | vt 0.383544 0.750239 164 | v -0.5 0.099294 0.75 165 | vn -0.294728 0.95012 0.10202 166 | vt 0.139898 0.753818 167 | v -0.75 0.042694 0.5 168 | vn -0.112021 0.992304 -0.0527594 169 | vt 0.265508 0.873692 170 | v -0.25 0.213935 0.5 171 | vn -0.398137 0.916209 -0.0452663 172 | vt 0.256152 0.622103 173 | v -0.5 0.116888 -0.75 174 | vn -0.0733077 0.994611 -0.0733077 175 | vt 0.864533 0.734489 176 | v -0.5 0.083436 -0.25 177 | vn -0.0739681 0.987634 0.138228 178 | vt 0.624722 0.740907 179 | v -0.75 0.083436 -0.5 180 | vn -0.165255 0.984622 0.056651 181 | vt 0.746889 0.857183 182 | v -0.25 0.116888 -0.5 183 | vn 0.0702904 0.995047 0.0702904 184 | vt 0.743944 0.61676 185 | v 0.5 0.004755 -0.75 186 | vn 0.0715804 0.997361 -0.0121557 187 | vt 0.86425 0.251907 188 | v 0.5 0.040022 -0.25 189 | vn 0.139181 0.949881 -0.279918 190 | vt 0.624397 0.251987 191 | v 0.25 0.038116 -0.5 192 | vn 0.167522 0.985556 -0.0248106 193 | vt 0.744633 0.373086 194 | v 0.75 0 -0.5 195 | vn 0 1 0 196 | vt 0.744145 0.131316 197 | v 0.75 0.009436 -0.25 198 | vn 0.0946236 0.985829 -0.138521 199 | vt 0.624252 0.130124 200 | v 0.25 0.076818 -0.25 201 | vn 0.122123 0.951846 -0.281203 202 | vt 0.623581 0.374984 203 | v 0.25 0.038116 -0.75 204 | vn 0.165052 0.98567 -0.0348114 205 | vt 0.864571 0.373146 206 | v -0.25 0.092852 -0.25 207 | vn -0.0419434 0.998969 0.0173475 208 | vt 0.623165 0.619545 209 | v -0.75 0.057923 -0.25 210 | vn -0.130143 0.9839 0.122491 211 | vt 0.627201 0.862234 212 | v -0.75 0.083436 -0.75 213 | vn -0.165091 0.984832 -0.0533939 214 | vt 0.865918 0.854412 215 | v -0.25 0.191886 0.75 216 | vn -0.339603 0.91894 0.200545 217 | vt 0.135015 0.626638 218 | v -0.75 0.0505 0.75 219 | vn -0.0886341 0.996029 0.00832303 220 | vt 0.144942 0.875989 221 | v -0.75 0.02549 0.25 222 | vn -0.0907082 0.994587 -0.0506727 223 | vt 0.386505 0.871975 224 | v 0.75 0.142605 0.75 225 | vn 0.397045 0.896741 0.195476 226 | vt 0.131519 0.133293 227 | v 0.25 0.298875 0.75 228 | vn 0.0459263 0.938479 0.342269 229 | vt 0.131561 0.382917 230 | v 0.25 0.292829 0.25 231 | vn 0.0227321 0.934794 -0.354462 232 | vt 0.368549 0.381605 233 | v 0.75 0.142605 0.25 234 | vn 0.397399 0.895258 -0.201464 235 | vt 0.375157 0.134944 236 | v -0.25 0.17035 0.25 237 | vn -0.352244 0.913571 -0.203252 238 | vt 0.378789 0.623482 239 | v -0.25 0.116888 -0.75 240 | vn 0.0748209 0.994386 -0.0748209 241 | vt 0.864083 0.61549 242 | v 0.75 0 -0.75 243 | vn 0 1 0 244 | vt 0.863566 0.131986 245 | v -1 0.028528 0.875 246 | vn -0.0823707 0.996238 0.0269226 247 | vt 0.0881689 0.997669 248 | v 0.875 0.035878 1 249 | vn 0.271438 0.935269 0.227143 250 | vt 0.0090216 0.0609628 251 | v 1 0 -0.875 252 | vn 0 1 0 253 | vt 0.923002 0.0122421 254 | v -0.875 0.040319 -1 255 | vn -0.145658 0.983888 -0.103673 256 | vt 0.986759 0.914894 257 | v -1 0.013205 -0.125 258 | vn -0.101038 0.99249 0.0689623 259 | vt 0.570825 0.98594 260 | v -0.125 0.143539 1 261 | vn -0.21717 0.909357 0.354835 262 | vt 0.00660166 0.575084 263 | v 1 0.024167 0.125 264 | vn 0.262069 0.954378 -0.143114 265 | vt 0.441622 0.00666585 266 | v 0.125 0.040319 -1 267 | vn 0.145676 0.985468 -0.0873543 268 | vt 0.984809 0.432566 269 | v 0 0.073107 -0.875 270 | vn 0.150356 0.983451 -0.10108 271 | vt 0.924564 0.494402 272 | v 0 0.210548 0.125 273 | vn -0.182733 0.923052 -0.338501 274 | vt 0.435867 0.500201 275 | v -0.875 0.01738 0 276 | vn -0.0929408 0.994412 0.0500682 277 | vt 0.508441 0.928248 278 | v 0.125 0.176371 0 279 | vn -0.0406378 0.927335 -0.372019 280 | vt 0.497597 0.439301 281 | v -1 0.018911 0.375 282 | vn -0.0697354 0.996233 -0.0515496 283 | vt 0.328058 0.992759 284 | v 0.375 0.16625 1 285 | vn 0.123275 0.886602 0.445803 286 | vt 0.000881973 0.315032 287 | v 1 0 -0.375 288 | vn 0 1 0 289 | vt 0.685 0.0108344 290 | v -0.375 0.087108 -1 291 | vn 0.0115603 0.987166 -0.159277 292 | vt 0.985109 0.675496 293 | v -1 0.040319 -0.625 294 | vn -0.182084 0.983253 0.00771147 295 | vt 0.810271 0.976962 296 | v -0.625 0.048437 1 297 | vn -0.069363 0.995663 0.0620003 298 | vt 0.022371 0.821731 299 | v 1 0.050124 0.625 300 | vn 0.396717 0.91652 0.0510636 301 | vt 0.191617 0.00473537 302 | v 0.625 0 -1 303 | vn 0.00227729 0.999997 0 304 | vt 0.983356 0.190782 305 | v 0 0.081 -0.375 306 | vn 0.108646 0.992579 -0.0546238 307 | vt 0.683549 0.496057 308 | v 0 0.304071 0.625 309 | vn -0.258842 0.954267 0.149582 310 | vt 0.193004 0.499528 311 | v -0.375 0.084654 0 312 | vn -0.224525 0.971319 -0.0782779 313 | vt 0.503354 0.685212 314 | v 0.625 0.109547 0 315 | vn 0.257241 0.904131 -0.341136 316 | vt 0.498475 0.19415 317 | v 0.5 0.198635 0.125 318 | vn 0.249398 0.894461 -0.371134 319 | vt 0.432704 0.259605 320 | v 0.5 0.280198 0.625 321 | vn 0.335154 0.928172 0.161767 322 | vt 0.19195 0.264841 323 | v 0.125 0.341855 0.5 324 | vn -0.145322 0.989196 -0.0192837 325 | vt 0.250718 0.439915 326 | v 0.625 0.236677 0.5 327 | vn 0.425648 0.904875 -0.0050135 328 | vt 0.251998 0.202628 329 | v -0.5 0.061576 0.125 330 | vn -0.247541 0.966912 -0.0616811 331 | vt 0.44418 0.749049 332 | v -0.5 0.10762 0.625 333 | vn -0.334055 0.942207 0.025578 334 | vt 0.200546 0.751488 335 | v -0.875 0.034327 0.5 336 | vn -0.0712807 0.996344 -0.0470972 337 | vt 0.266802 0.933647 338 | v -0.375 0.157545 0.5 339 | vn -0.395209 0.917116 -0.0520356 340 | vt 0.258711 0.686298 341 | v -0.5 0.103126 -0.875 342 | vn -0.0640714 0.989347 -0.130716 343 | vt 0.924695 0.734583 344 | v -0.5 0.103126 -0.375 345 | vn -0.0675366 0.989152 0.13045 346 | vt 0.685101 0.73839 347 | v -0.875 0.060773 -0.5 348 | vn -0.176525 0.983228 0.0458506 349 | vt 0.748489 0.918003 350 | v -0.375 0.121952 -0.5 351 | vn -0.00147389 0.996963 0.0778641 352 | vt 0.744451 0.676643 353 | v 0.5 0.00291 -0.875 354 | vn 0.0553815 0.998308 -0.0177284 355 | vt 0.924067 0.25156 356 | v 0.5 0.010814 -0.375 357 | vn 0.1044 0.985719 -0.132134 358 | vt 0.685283 0.251245 359 | v 0.125 0.060773 -0.5 360 | vn 0.174093 0.984668 -0.0109451 361 | vt 0.744167 0.434355 362 | v 0.625 0 -0.5 363 | vn 0.0230584 0.999721 -0.00522198 364 | vt 0.744457 0.191337 365 | v -1 0.028528 0.625 366 | vn -0.0858245 0.996137 -0.0186067 367 | vt 0.207491 0.994565 368 | v 0.625 0.109547 1 369 | vn 0.267253 0.893348 0.361255 370 | vt 0.00492841 0.185937 371 | v 1 0 -0.625 372 | vn 0 1 0 373 | vt 0.804366 0.0121682 374 | v -0.625 0.073107 -1 375 | vn -0.0990464 0.984442 -0.145137 376 | vt 0.985505 0.795512 377 | v -1 0.031941 -0.375 378 | vn -0.153419 0.985563 0.0716126 379 | vt 0.691154 0.980937 380 | v -0.375 0.084513 1 381 | vn -0.227985 0.948169 0.221357 382 | vt 0.0145075 0.701482 383 | v 1 0.050124 0.375 384 | vn 0.379569 0.921888 -0.0777775 385 | vt 0.31634 0.00552326 386 | v 0.375 0.008895 -1 387 | vn 0.089371 0.99539 -0.0347951 388 | vt 0.984314 0.310924 389 | v 0 0.087108 -0.625 390 | vn 0.170711 0.985319 -0.00192158 391 | vt 0.804043 0.495441 392 | v 0 0.295524 0.375 393 | vn -0.271846 0.941486 -0.199257 394 | vt 0.311297 0.498439 395 | v -0.625 0.040639 0 396 | vn -0.124064 0.990309 0.0624177 397 | vt 0.505417 0.80756 398 | v 0.375 0.16516 0 399 | vn 0.132914 0.897786 -0.419899 400 | vt 0.496318 0.317955 401 | v -1 0.006385 0.125 402 | vn -0.0593729 0.997835 -0.0282959 403 | vt 0.449687 0.990296 404 | v 0.125 0.179269 1 405 | vn -0.071667 0.894538 0.44121 406 | vt 0.00140172 0.445388 407 | v 1 0.000575 -0.125 408 | vn 0.0669329 0.996088 -0.057694 409 | vt 0.56447 0.00885078 410 | v -0.125 0.073107 -1 411 | vn 0.11365 0.984537 -0.13331 412 | vt 0.984941 0.554508 413 | v -1 0.031941 -0.875 414 | vn -0.167261 0.984002 -0.0613588 415 | vt 0.928509 0.974888 416 | v -0.875 0.034327 1 417 | vn -0.0763037 0.996429 0.0361607 418 | vt 0.0270287 0.939824 419 | v 1 0.024167 0.875 420 | vn 0.311633 0.940503 0.135419 421 | vt 0.0697148 0.00250442 422 | v 0.875 0 -1 423 | vn 0 1 0 424 | vt 0.982798 0.0715329 425 | v 0 0.126033 -0.125 426 | vn -0.0503915 0.964891 -0.25777 427 | vt 0.561463 0.499065 428 | v 0 0.225132 0.875 429 | vn -0.173589 0.906779 0.384213 430 | vt 0.0689794 0.505457 431 | v -0.125 0.143914 0 432 | vn -0.185109 0.95163 -0.245223 433 | vt 0.500606 0.56127 434 | v 0.875 0.035878 0 435 | vn 0.235502 0.953191 -0.189646 436 | vt 0.50208 0.0688296 437 | v 0.5 0.280198 0.375 438 | vn 0.333349 0.927392 -0.16977 439 | vt 0.309716 0.264967 440 | v 0.5 0.198635 0.875 441 | vn 0.249914 0.894871 0.369795 442 | vt 0.0676763 0.257195 443 | v 0.375 0.33169 0.5 444 | vn 0.2194 0.975594 -0.00891018 445 | vt 0.250268 0.325835 446 | v 0.875 0.109547 0.5 447 | vn 0.425556 0.90492 -0.0046469 448 | vt 0.253914 0.0704636 449 | v -0.5 0.091193 0.375 450 | vn -0.333326 0.936164 -0.111759 451 | vt 0.322396 0.750393 452 | v -0.5 0.081646 0.875 453 | vn -0.229162 0.961349 0.152621 454 | vt 0.079185 0.757499 455 | v -0.625 0.063437 0.5 456 | vn -0.233648 0.970742 -0.0553887 457 | vt 0.26368 0.813129 458 | v -0.125 0.267441 0.5 459 | vn -0.361198 0.931759 -0.0369089 460 | vt 0.253834 0.559148 461 | v -0.5 0.121952 -0.625 462 | vn -0.0778641 0.996963 0.0014739 463 | vt 0.804762 0.735148 464 | v -0.5 0.063919 -0.125 465 | vn -0.113543 0.989775 0.0863356 466 | vt 0.564264 0.743969 467 | v -0.625 0.103126 -0.5 468 | vn -0.131198 0.989104 0.0667787 469 | vt 0.745824 0.79662 470 | v -0.125 0.103126 -0.5 471 | vn 0.123599 0.991185 0.0477138 472 | vt 0.743685 0.556435 473 | v 0.5 0.005475 -0.625 474 | vn 0.0773581 0.997002 -0.00193801 475 | vt 0.804482 0.251857 476 | v 0.5 0.086786 -0.125 477 | vn 0.170505 0.915056 -0.365513 478 | vt 0.561309 0.253836 479 | v 0.375 0.018448 -0.5 480 | vn 0.136791 0.990293 -0.024673 481 | vt 0.744907 0.312074 482 | v 0.875 0 -0.5 483 | vn 0 1 0 484 | vt 0.744194 0.0713996 485 | v 0.75 0 -0.375 486 | vn 0.017941 0.99942 -0.0289406 487 | vt 0.68434 0.13069 488 | v 0.75 0.035878 -0.125 489 | vn 0.189646 0.953191 -0.235502 490 | vt 0.562906 0.130252 491 | v 0.625 0.024167 -0.25 492 | vn 0.123507 0.96626 -0.226024 493 | vt 0.624264 0.190918 494 | v 0.875 0.000575 -0.25 495 | vn 0.0413868 0.998012 -0.0475381 496 | vt 0.624309 0.0698324 497 | v 0.25 0.04679 -0.375 498 | vn 0.152134 0.977393 -0.146827 499 | vt 0.684743 0.373489 500 | v 0.25 0.121854 -0.125 501 | vn 0.0850901 0.926794 -0.365804 502 | vt 0.560736 0.376878 503 | v 0.125 0.090084 -0.25 504 | vn 0.0806912 0.967271 -0.240574 505 | vt 0.623152 0.43638 506 | v 0.375 0.058865 -0.25 507 | vn 0.142205 0.944735 -0.295388 508 | vt 0.624109 0.31343 509 | v 0.25 0.031941 -0.875 510 | vn 0.148791 0.986986 -0.0609919 511 | vt 0.92463 0.372574 512 | v 0.25 0.040319 -0.625 513 | vn 0.170674 0.985326 -0.00192912 514 | vt 0.804559 0.373328 515 | v 0.125 0.060773 -0.75 516 | vn 0.176525 0.983228 -0.0458506 517 | vt 0.864456 0.434147 518 | v 0.375 0.018448 -0.75 519 | vn 0.130343 0.991189 -0.0235836 520 | vt 0.864512 0.312329 521 | v -0.25 0.103126 -0.375 522 | vn 0.0389545 0.996212 0.0777403 523 | vt 0.683499 0.617729 524 | v -0.25 0.097732 -0.125 525 | vn -0.137902 0.986703 -0.0860227 526 | vt 0.562951 0.621639 527 | v -0.375 0.087683 -0.25 528 | vn -0.0557646 0.993876 0.0953976 529 | vt 0.62363 0.68032 530 | v -0.125 0.097152 -0.25 531 | vn -0.0123514 0.996592 -0.0815563 532 | vt 0.623003 0.558606 533 | v -0.75 0.073107 -0.375 534 | vn -0.150356 0.983451 0.10108 535 | vt 0.687199 0.859494 536 | v -0.75 0.041691 -0.125 537 | vn -0.11096 0.987679 0.110357 538 | vt 0.567006 0.86516 539 | v -0.875 0.040319 -0.25 540 | vn -0.138239 0.985285 0.100521 541 | vt 0.628874 0.922931 542 | v -0.625 0.073107 -0.25 543 | vn -0.10239 0.984762 0.140572 544 | vt 0.625892 0.801525 545 | v -0.75 0.073107 -0.875 546 | vn -0.149705 0.983771 -0.0989126 547 | vt 0.925749 0.854287 548 | v -0.75 0.087108 -0.625 549 | vn -0.170711 0.985319 0.00192158 550 | vt 0.806385 0.855441 551 | v -0.875 0.060773 -0.75 552 | vn -0.176455 0.983397 -0.0423549 553 | vt 0.867293 0.914948 554 | v -0.625 0.103126 -0.75 555 | vn -0.130716 0.989347 -0.0640714 556 | vt 0.865073 0.794243 557 | v -0.25 0.211739 0.625 558 | vn -0.38045 0.920926 0.0845784 559 | vt 0.195826 0.62344 560 | v -0.25 0.157545 0.875 561 | vn -0.283504 0.916044 0.283705 562 | vt 0.0731117 0.63172 563 | v -0.375 0.143945 0.75 564 | vn -0.340739 0.927732 0.152351 565 | vt 0.137294 0.690415 566 | v -0.125 0.236928 0.75 567 | vn -0.298777 0.921626 0.247666 568 | vt 0.13332 0.563558 569 | v -0.75 0.048437 0.625 570 | vn -0.106741 0.994007 -0.0236125 571 | vt 0.205116 0.874598 572 | v -0.75 0.048437 0.875 573 | vn -0.068404 0.997052 0.0347457 574 | vt 0.0849974 0.87805 575 | v -0.875 0.040909 0.75 576 | vn -0.0811805 0.996699 0.000906796 577 | vt 0.146665 0.935918 578 | v -0.625 0.065267 0.75 579 | vn -0.184334 0.981693 0.0479616 580 | vt 0.14256 0.815782 581 | v -0.75 0.023905 0.125 582 | vn -0.08921 0.995969 0.00934869 583 | vt 0.446732 0.870278 584 | v -0.75 0.034327 0.375 585 | vn -0.102064 0.992218 -0.0713241 586 | vt 0.326022 0.872945 587 | v -0.875 0.018911 0.25 588 | vn -0.0548648 0.99703 -0.0540378 589 | vt 0.387733 0.931847 590 | v -0.625 0.039405 0.25 591 | vn -0.189767 0.979343 -0.0698209 592 | vt 0.385217 0.811954 593 | v 0.75 0.165123 0.625 594 | vn 0.435773 0.893957 0.104607 595 | vt 0.192642 0.135916 596 | v 0.75 0.109547 0.875 597 | vn 0.339518 0.905891 0.253157 598 | vt 0.0695793 0.128976 599 | v 0.625 0.198635 0.75 600 | vn 0.370436 0.896044 0.244707 601 | vt 0.131224 0.198398 602 | v 0.875 0.086786 0.75 603 | vn 0.373598 0.916029 0.145999 604 | vt 0.131423 0.067963 605 | v 0.25 0.336782 0.625 606 | vn 0.043309 0.980045 0.194003 607 | vt 0.192253 0.383323 608 | v 0.25 0.243781 0.875 609 | vn 0.045403 0.903449 0.426285 610 | vt 0.0673532 0.381926 611 | v 0.125 0.295524 0.75 612 | vn -0.0995453 0.939566 0.327577 613 | vt 0.131877 0.441983 614 | v 0.375 0.281643 0.75 615 | vn 0.1865 0.925985 0.328281 616 | vt 0.131176 0.323275 617 | v 0.25 0.236679 0.125 618 | vn 0.0230728 0.910783 -0.41224 619 | vt 0.431953 0.380373 620 | v 0.25 0.333441 0.375 621 | vn 0.0326945 0.975464 -0.217716 622 | vt 0.308081 0.382541 623 | v 0.125 0.284523 0.25 624 | vn -0.122216 0.931129 -0.343602 625 | vt 0.370089 0.439937 626 | v 0.375 0.280198 0.25 627 | vn 0.171468 0.926853 -0.33398 628 | vt 0.368556 0.323047 629 | v 0.75 0.109547 0.125 630 | vn 0.341136 0.904131 -0.257241 631 | vt 0.437509 0.133005 632 | v 0.75 0.165123 0.375 633 | vn 0.435576 0.89304 -0.112934 634 | vt 0.313775 0.136466 635 | v 0.625 0.198635 0.25 636 | vn 0.371175 0.894457 -0.249352 637 | vt 0.372557 0.199699 638 | v 0.875 0.086786 0.25 639 | vn 0.374305 0.91458 -0.153099 640 | vt 0.377392 0.0698113 641 | v -0.25 0.141529 0.125 642 | vn -0.296336 0.933584 -0.201508 643 | vt 0.440629 0.623711 644 | v -0.25 0.198056 0.375 645 | vn -0.388766 0.908702 -0.152061 646 | vt 0.317016 0.622475 647 | v -0.375 0.120327 0.25 648 | vn -0.35244 0.92313 -0.15368 649 | vt 0.381387 0.687014 650 | v -0.125 0.217658 0.25 651 | vn -0.313172 0.91471 -0.2554 652 | vt 0.375868 0.560762 653 | v -0.25 0.103126 -0.875 654 | vn 0.0667787 0.989104 -0.131198 655 | vt 0.924414 0.615157 656 | v -0.25 0.121952 -0.625 657 | vn 0.0778641 0.996963 -0.0014739 658 | vt 0.804026 0.616046 659 | v -0.375 0.121952 -0.75 660 | vn 0.0014739 0.996963 -0.0778641 661 | vt 0.864209 0.675025 662 | v -0.125 0.103126 -0.75 663 | vn 0.131198 0.989104 -0.0667787 664 | vt 0.864119 0.555524 665 | v 0.75 0 -0.875 666 | vn 0 1 0 667 | vt 0.923253 0.131777 668 | v 0.75 0 -0.625 669 | vn 0 1 0 670 | vt 0.803873 0.131795 671 | v 0.625 0 -0.75 672 | vn 0.0165518 0.99986 -0.00245836 673 | vt 0.863872 0.191876 674 | v 0.875 0 -0.75 675 | vn 0 1 0 676 | vt 0.863481 0.0721826 677 | v 0.875 0 -0.625 678 | vn 0 1 0 679 | vt 0.80388 0.0719417 680 | v 0.625 0 -0.625 681 | vn 0.020926 0.99978 -0.000959278 682 | vt 0.804147 0.191746 683 | v 0.625 0 -0.875 684 | vn 0.00889667 0.999957 -0.00274042 685 | vt 0.923615 0.191605 686 | v -0.125 0.107516 -0.625 687 | vn 0.136164 0.990685 -0.00187195 688 | vt 0.803929 0.556021 689 | v -0.375 0.127427 -0.625 690 | vn -6.22014e-10 1 -1.24403e-09 691 | vt 0.804314 0.675616 692 | v -0.375 0.107516 -0.875 693 | vn 0.00187195 0.990685 -0.136164 694 | vt 0.924479 0.67494 695 | v -0.125 0.251143 0.375 696 | vn -0.351506 0.919529 -0.17581 697 | vt 0.314067 0.559454 698 | v -0.375 0.142463 0.375 699 | vn -0.385273 0.913452 -0.131039 700 | vt 0.319852 0.686563 701 | v -0.375 0.099948 0.125 702 | vn -0.298691 0.945249 -0.131481 703 | vt 0.442627 0.68656 704 | v 0.875 0.103562 0.375 705 | vn 0.412359 0.906885 -0.0867151 706 | vt 0.315415 0.0703861 707 | v 0.625 0.226699 0.375 708 | vn 0.410479 0.900956 -0.140661 709 | vt 0.31171 0.201871 710 | v 0.625 0.15738 0.125 711 | vn 0.317844 0.893281 -0.317844 712 | vt 0.434973 0.196883 713 | v 0.375 0.317603 0.375 714 | vn 0.202039 0.959199 -0.197783 715 | vt 0.308362 0.324947 716 | v 0.125 0.325023 0.375 717 | vn -0.141774 0.966018 -0.216124 718 | vt 0.309133 0.439715 719 | v 0.125 0.23007 0.125 720 | vn -0.0881102 0.917119 -0.388754 721 | vt 0.433684 0.439989 722 | v 0.375 0.228269 0.875 723 | vn 0.156968 0.898721 0.409465 724 | vt 0.0671834 0.320003 725 | v 0.125 0.242463 0.875 726 | vn -0.0721435 0.906314 0.4164 727 | vt 0.0679323 0.443472 728 | v 0.125 0.330912 0.625 729 | vn -0.127805 0.97553 0.178904 730 | vt 0.192499 0.440739 731 | v 0.875 0.062553 0.875 732 | vn 0.312761 0.931567 0.185374 733 | vt 0.0701742 0.0651026 734 | v 0.625 0.15738 0.875 735 | vn 0.315455 0.894973 0.315455 736 | vt 0.0685911 0.193355 737 | v 0.625 0.226699 0.625 738 | vn 0.410693 0.902083 0.132582 739 | vt 0.19223 0.201491 740 | v -0.625 0.052195 0.375 741 | vn -0.217144 0.971868 -0.0912176 742 | vt 0.324512 0.812661 743 | v -0.875 0.027188 0.375 744 | vn -0.0607662 0.996301 -0.0607662 745 | vt 0.327202 0.93284 746 | v -0.875 0.014269 0.125 747 | vn -0.0699878 0.997528 -0.00621082 748 | vt 0.448163 0.93035 749 | v -0.625 0.057245 0.875 750 | vn -0.121899 0.989686 0.0752475 751 | vt 0.0823113 0.818344 752 | v -0.875 0.039183 0.875 753 | vn -0.0786358 0.996539 0.0269568 754 | vt 0.0868524 0.937762 755 | v -0.875 0.039183 0.625 756 | vn -0.0785362 0.996587 -0.0254091 757 | vt 0.206621 0.93458 758 | v -0.125 0.195229 0.875 759 | vn -0.245951 0.908434 0.338017 760 | vt 0.0706955 0.568285 761 | v -0.375 0.1176 0.875 762 | vn -0.28144 0.933362 0.222773 763 | vt 0.0760354 0.695072 764 | v -0.375 0.158079 0.625 765 | vn -0.380249 0.923292 0.0542413 766 | vt 0.198057 0.687504 767 | v -0.625 0.107516 -0.625 768 | vn -0.136164 0.990685 0.00187194 769 | vt 0.805405 0.795053 770 | v -0.875 0.063713 -0.625 771 | vn -0.182099 0.983278 0.00192417 772 | vt 0.807923 0.916175 773 | v -0.875 0.052485 -0.875 774 | vn -0.160413 0.98389 -0.0789176 775 | vt 0.926794 0.91444 776 | v -0.625 0.054724 -0.125 777 | vn -0.0999806 0.988199 0.116044 778 | vt 0.565598 0.80454 779 | v -0.875 0.026792 -0.125 780 | vn -0.114353 0.989436 0.089107 781 | vt 0.568672 0.925706 782 | v -0.875 0.052485 -0.375 783 | vn -0.160765 0.983611 0.0816294 784 | vt 0.688829 0.9203 785 | v -0.125 0.114737 -0.125 786 | vn -0.106615 0.978264 -0.177855 787 | vt 0.56225 0.560254 788 | v -0.375 0.078815 -0.125 789 | vn -0.135478 0.990727 0.0102891 790 | vt 0.563524 0.683011 791 | v -0.375 0.107516 -0.375 792 | vn -0.0134669 0.99239 0.1224 793 | vt 0.684246 0.678132 794 | v 0.375 0.01991 -0.625 795 | vn 0.136043 0.990701 -0.00194605 796 | vt 0.804644 0.31239 797 | v 0.125 0.063713 -0.625 798 | vn 0.182099 0.983278 -0.00192417 799 | vt 0.804304 0.434448 800 | v 0.125 0.052485 -0.875 801 | vn 0.160765 0.983611 -0.0816294 802 | vt 0.924649 0.433511 803 | v 0.375 0.106643 -0.125 804 | vn 0.13476 0.914483 -0.381524 805 | vt 0.561007 0.315448 806 | v 0.125 0.128768 -0.125 807 | vn 0.0185838 0.946393 -0.322481 808 | vt 0.560872 0.438021 809 | v 0.125 0.065378 -0.375 810 | vn 0.136953 0.984204 -0.112193 811 | vt 0.684109 0.434855 812 | v 0.875 0.01292 -0.125 813 | vn 0.137785 0.980832 -0.137785 814 | vt 0.563712 0.0690596 815 | v 0.625 0.062553 -0.125 816 | vn 0.192152 0.929911 -0.313598 817 | vt 0.561966 0.192043 818 | v 0.625 0.002319 -0.375 819 | vn 0.0542942 0.994974 -0.0841383 820 | vt 0.684793 0.190844 821 | v 0.875 0 -0.375 822 | vn 0.000766653 0.999998 -0.00153331 823 | vt 0.684354 0.0706804 824 | v 0.375 0.027333 -0.375 825 | vn 0.143972 0.977587 -0.153609 826 | vt 0.685223 0.312181 827 | v 0.375 0.014426 -0.875 828 | vn 0.113626 0.992738 -0.0395024 829 | vt 0.924438 0.311865 830 | v -0.125 0.093223 -0.375 831 | vn 0.0774083 0.996913 0.013105 832 | vt 0.683261 0.557009 833 | v -0.625 0.090905 -0.375 834 | vn -0.118336 0.985897 0.118336 835 | vt 0.686031 0.798812 836 | v -0.625 0.090905 -0.875 837 | vn -0.11698 0.986221 -0.11698 838 | vt 0.925092 0.79433 839 | v -0.125 0.262353 0.625 840 | vn -0.340992 0.932802 0.116638 841 | vt 0.194093 0.560501 842 | v -0.625 0.067945 0.625 843 | vn -0.223822 0.974628 -0.00168315 844 | vt 0.203021 0.814073 845 | v -0.625 0.034688 0.125 846 | vn -0.157911 0.987441 -0.00488295 847 | vt 0.4454 0.810205 848 | v 0.875 0.103562 0.625 849 | vn 0.412228 0.907727 0.0780963 850 | vt 0.192665 0.0697177 851 | v 0.375 0.318512 0.625 852 | vn 0.21113 0.959653 0.185717 853 | vt 0.191987 0.325253 854 | v 0.375 0.226699 0.125 855 | vn 0.144892 0.901994 -0.406711 856 | vt 0.431464 0.320624 857 | v 0.875 0.062553 0.125 858 | vn 0.314561 0.929807 -0.191079 859 | vt 0.439766 0.0691622 860 | v -0.125 0.179938 0.125 861 | vn -0.254676 0.927998 -0.271957 862 | vt 0.438288 0.561433 863 | v -0.125 0.090905 -0.875 864 | vn 0.118336 0.985897 -0.118336 865 | vt 0.924462 0.554996 866 | v 0.875 0 -0.875 867 | vn 0 1 0 868 | vt 0.923083 0.0720194 869 | f 84/84/84 141/141/141 289/289/289 870 | f 90/90/90 137/137/137 288/288/288 871 | f 91/91/91 144/144/144 287/287/287 872 | f 88/88/88 145/145/145 286/286/286 873 | f 106/106/106 133/133/133 285/285/285 874 | f 107/107/107 148/148/148 284/284/284 875 | f 100/100/100 149/149/149 283/283/283 876 | f 110/110/110 132/132/132 282/282/282 877 | f 111/111/111 152/152/152 281/281/281 878 | f 103/103/103 153/153/153 280/280/280 879 | f 114/114/114 125/125/125 279/279/279 880 | f 115/115/115 156/156/156 278/278/278 881 | f 102/102/102 157/157/157 277/277/277 882 | f 118/118/118 129/129/129 276/276/276 883 | f 119/119/119 160/160/160 275/275/275 884 | f 96/96/96 161/161/161 274/274/274 885 | f 162/162/162 121/121/121 273/273/273 886 | f 163/163/163 164/164/164 272/272/272 887 | f 136/136/136 165/165/165 271/271/271 888 | f 166/166/166 120/120/120 270/270/270 889 | f 167/167/167 168/168/168 269/269/269 890 | f 159/159/159 169/169/169 268/268/268 891 | f 170/170/170 89/89/89 267/267/267 892 | f 171/171/171 172/172/172 266/266/266 893 | f 158/158/158 173/173/173 265/265/265 894 | f 174/174/174 117/117/117 264/264/264 895 | f 175/175/175 176/176/176 263/263/263 896 | f 142/142/142 177/177/177 262/262/262 897 | f 178/178/178 116/116/116 261/261/261 898 | f 179/179/179 180/180/180 260/260/260 899 | f 155/155/155 181/181/181 259/259/259 900 | f 182/182/182 85/85/85 258/258/258 901 | f 183/183/183 184/184/184 257/257/257 902 | f 154/154/154 185/185/185 256/256/256 903 | f 186/186/186 113/113/113 255/255/255 904 | f 187/187/187 188/188/188 254/254/254 905 | f 143/143/143 189/189/189 253/253/253 906 | f 190/190/190 112/112/112 252/252/252 907 | f 191/191/191 192/192/192 251/251/251 908 | f 151/151/151 193/193/193 250/250/250 909 | f 194/194/194 92/92/92 249/249/249 910 | f 195/195/195 196/196/196 248/248/248 911 | f 150/150/150 197/197/197 247/247/247 912 | f 198/198/198 109/109/109 246/246/246 913 | f 199/199/199 200/200/200 245/245/245 914 | f 140/140/140 201/201/201 244/244/244 915 | f 202/202/202 108/108/108 243/243/243 916 | f 203/203/203 204/204/204 242/242/242 917 | f 147/147/147 205/205/205 241/241/241 918 | f 206/206/206 93/93/93 240/240/240 919 | f 207/207/207 208/208/208 239/239/239 920 | f 146/146/146 209/209/209 238/238/238 921 | f 210/210/210 105/105/105 237/237/237 922 | f 211/211/211 212/212/212 236/236/236 923 | f 128/128/128 213/213/213 235/235/235 924 | f 214/214/214 104/104/104 234/234/234 925 | f 215/215/215 216/216/216 233/233/233 926 | f 131/131/131 217/217/217 232/232/232 927 | f 218/218/218 97/97/97 231/231/231 928 | f 219/219/219 220/220/220 230/230/230 929 | f 130/130/130 221/221/221 229/229/229 930 | f 222/222/222 101/101/101 228/228/228 931 | f 223/223/223 224/224/224 227/227/227 932 | f 124/124/124 225/225/225 226/226/226 933 | f 226/226/226 81/81/81 223/223/223 934 | f 161/161/161 223/223/223 65/65/65 935 | f 12/12/12 226/226/226 161/161/161 936 | f 227/227/227 62/62/62 158/158/158 937 | f 121/121/121 158/158/158 25/25/25 938 | f 65/65/65 227/227/227 121/121/121 939 | f 228/228/228 17/17/17 118/118/118 940 | f 224/224/224 118/118/118 62/62/62 941 | f 81/81/81 228/228/228 224/224/224 942 | f 229/229/229 80/80/80 219/219/219 943 | f 157/157/157 219/219/219 61/61/61 944 | f 18/18/18 229/229/229 157/157/157 945 | f 230/230/230 58/58/58 154/154/154 946 | f 117/117/117 154/154/154 24/24/24 947 | f 61/61/61 230/230/230 117/117/117 948 | f 231/231/231 13/13/13 114/114/114 949 | f 220/220/220 114/114/114 58/58/58 950 | f 80/80/80 231/231/231 220/220/220 951 | f 232/232/232 79/79/79 215/215/215 952 | f 153/153/153 215/215/215 57/57/57 953 | f 19/19/19 232/232/232 153/153/153 954 | f 233/233/233 54/54/54 150/150/150 955 | f 113/113/113 150/150/150 23/23/23 956 | f 57/57/57 233/233/233 113/113/113 957 | f 234/234/234 20/20/20 110/110/110 958 | f 216/216/216 110/110/110 54/54/54 959 | f 79/79/79 234/234/234 216/216/216 960 | f 235/235/235 78/78/78 211/211/211 961 | f 149/149/149 211/211/211 53/53/53 962 | f 16/16/16 235/235/235 149/149/149 963 | f 236/236/236 50/50/50 146/146/146 964 | f 109/109/109 146/146/146 22/22/22 965 | f 53/53/53 236/236/236 109/109/109 966 | f 237/237/237 21/21/21 106/106/106 967 | f 212/212/212 106/106/106 50/50/50 968 | f 78/78/78 237/237/237 212/212/212 969 | f 238/238/238 77/77/77 207/207/207 970 | f 148/148/148 207/207/207 52/52/52 971 | f 22/22/22 238/238/238 148/148/148 972 | f 239/239/239 35/35/35 131/131/131 973 | f 108/108/108 131/131/131 19/19/19 974 | f 52/52/52 239/239/239 108/108/108 975 | f 240/240/240 9/9/9 91/91/91 976 | f 208/208/208 91/91/91 35/35/35 977 | f 77/77/77 240/240/240 208/208/208 978 | f 241/241/241 76/76/76 203/203/203 979 | f 95/95/95 203/203/203 39/39/39 980 | f 11/11/11 241/241/241 95/95/95 981 | f 242/242/242 47/47/47 143/143/143 982 | f 135/135/135 143/143/143 6/6/6 983 | f 39/39/39 242/242/242 135/135/135 984 | f 243/243/243 19/19/19 103/103/103 985 | f 204/204/204 103/103/103 47/47/47 986 | f 76/76/76 243/243/243 204/204/204 987 | f 244/244/244 75/75/75 199/199/199 988 | f 83/83/83 199/199/199 27/27/27 989 | f 2/2/2 244/244/244 83/83/83 990 | f 245/245/245 51/51/51 147/147/147 991 | f 123/123/123 147/147/147 11/11/11 992 | f 27/27/27 245/245/245 123/123/123 993 | f 246/246/246 22/22/22 107/107/107 994 | f 200/200/200 107/107/107 51/51/51 995 | f 75/75/75 246/246/246 200/200/200 996 | f 247/247/247 74/74/74 195/195/195 997 | f 152/152/152 195/195/195 56/56/56 998 | f 23/23/23 247/247/247 152/152/152 999 | f 248/248/248 38/38/38 94/94/94 1000 | f 112/112/112 94/94/94 10/10/10 1001 | f 56/56/56 248/248/248 112/112/112 1002 | f 249/249/249 5/5/5 134/134/134 1003 | f 196/196/196 134/134/134 38/38/38 1004 | f 74/74/74 249/249/249 196/196/196 1005 | f 250/250/250 73/73/73 191/191/191 1006 | f 99/99/99 191/191/191 43/43/43 1007 | f 15/15/15 250/250/250 99/99/99 1008 | f 251/251/251 26/26/26 82/82/82 1009 | f 139/139/139 82/82/82 1/1/1 1010 | f 43/43/43 251/251/251 139/139/139 1011 | f 252/252/252 10/10/10 122/122/122 1012 | f 192/192/192 122/122/122 26/26/26 1013 | f 73/73/73 252/252/252 192/192/192 1014 | f 253/253/253 72/72/72 187/187/187 1015 | f 87/87/87 187/187/187 31/31/31 1016 | f 6/6/6 253/253/253 87/87/87 1017 | f 254/254/254 55/55/55 151/151/151 1018 | f 127/127/127 151/151/151 15/15/15 1019 | f 31/31/31 254/254/254 127/127/127 1020 | f 255/255/255 23/23/23 111/111/111 1021 | f 188/188/188 111/111/111 55/55/55 1022 | f 72/72/72 255/255/255 188/188/188 1023 | f 256/256/256 71/71/71 183/183/183 1024 | f 156/156/156 183/183/183 60/60/60 1025 | f 24/24/24 256/256/256 156/156/156 1026 | f 257/257/257 42/42/42 98/98/98 1027 | f 116/116/116 98/98/98 14/14/14 1028 | f 60/60/60 257/257/257 116/116/116 1029 | f 258/258/258 3/3/3 138/138/138 1030 | f 184/184/184 138/138/138 42/42/42 1031 | f 71/71/71 258/258/258 184/184/184 1032 | f 259/259/259 70/70/70 179/179/179 1033 | f 132/132/132 179/179/179 36/36/36 1034 | f 20/20/20 259/259/259 132/132/132 1035 | f 260/260/260 30/30/30 86/86/86 1036 | f 92/92/92 86/86/86 5/5/5 1037 | f 36/36/36 260/260/260 92/92/92 1038 | f 261/261/261 14/14/14 126/126/126 1039 | f 180/180/180 126/126/126 30/30/30 1040 | f 70/70/70 261/261/261 180/180/180 1041 | f 262/262/262 69/69/69 175/175/175 1042 | f 144/144/144 175/175/175 48/48/48 1043 | f 9/9/9 262/262/262 144/144/144 1044 | f 263/263/263 59/59/59 155/155/155 1045 | f 104/104/104 155/155/155 20/20/20 1046 | f 48/48/48 263/263/263 104/104/104 1047 | f 264/264/264 24/24/24 115/115/115 1048 | f 176/176/176 115/115/115 59/59/59 1049 | f 69/69/69 264/264/264 176/176/176 1050 | f 265/265/265 68/68/68 171/171/171 1051 | f 160/160/160 171/171/171 64/64/64 1052 | f 25/25/25 265/265/265 160/160/160 1053 | f 266/266/266 34/34/34 130/130/130 1054 | f 120/120/120 130/130/130 18/18/18 1055 | f 64/64/64 266/266/266 120/120/120 1056 | f 267/267/267 8/8/8 90/90/90 1057 | f 172/172/172 90/90/90 34/34/34 1058 | f 68/68/68 267/267/267 172/172/172 1059 | f 268/268/268 67/67/67 167/167/167 1060 | f 133/133/133 167/167/167 37/37/37 1061 | f 21/21/21 268/268/268 133/133/133 1062 | f 269/269/269 46/46/46 142/142/142 1063 | f 93/93/93 142/142/142 9/9/9 1064 | f 37/37/37 269/269/269 93/93/93 1065 | f 270/270/270 18/18/18 102/102/102 1066 | f 168/168/168 102/102/102 46/46/46 1067 | f 67/67/67 270/270/270 168/168/168 1068 | f 271/271/271 66/66/66 163/163/163 1069 | f 145/145/145 163/163/163 49/49/49 1070 | f 7/7/7 271/271/271 145/145/145 1071 | f 272/272/272 63/63/63 159/159/159 1072 | f 105/105/105 159/159/159 21/21/21 1073 | f 49/49/49 272/272/272 105/105/105 1074 | f 273/273/273 25/25/25 119/119/119 1075 | f 164/164/164 119/119/119 63/63/63 1076 | f 66/66/66 273/273/273 164/164/164 1077 | f 274/274/274 65/65/65 162/162/162 1078 | f 165/165/165 162/162/162 66/66/66 1079 | f 40/40/40 274/274/274 165/165/165 1080 | f 275/275/275 64/64/64 166/166/166 1081 | f 169/169/169 166/166/166 67/67/67 1082 | f 63/63/63 275/275/275 169/169/169 1083 | f 276/276/276 33/33/33 170/170/170 1084 | f 173/173/173 170/170/170 68/68/68 1085 | f 62/62/62 276/276/276 173/173/173 1086 | f 277/277/277 61/61/61 174/174/174 1087 | f 177/177/177 174/174/174 69/69/69 1088 | f 46/46/46 277/277/277 177/177/177 1089 | f 278/278/278 60/60/60 178/178/178 1090 | f 181/181/181 178/178/178 70/70/70 1091 | f 59/59/59 278/278/278 181/181/181 1092 | f 279/279/279 29/29/29 182/182/182 1093 | f 185/185/185 182/182/182 71/71/71 1094 | f 58/58/58 279/279/279 185/185/185 1095 | f 280/280/280 57/57/57 186/186/186 1096 | f 189/189/189 186/186/186 72/72/72 1097 | f 47/47/47 280/280/280 189/189/189 1098 | f 281/281/281 56/56/56 190/190/190 1099 | f 193/193/193 190/190/190 73/73/73 1100 | f 55/55/55 281/281/281 193/193/193 1101 | f 282/282/282 36/36/36 194/194/194 1102 | f 197/197/197 194/194/194 74/74/74 1103 | f 54/54/54 282/282/282 197/197/197 1104 | f 283/283/283 53/53/53 198/198/198 1105 | f 201/201/201 198/198/198 75/75/75 1106 | f 44/44/44 283/283/283 201/201/201 1107 | f 284/284/284 52/52/52 202/202/202 1108 | f 205/205/205 202/202/202 76/76/76 1109 | f 51/51/51 284/284/284 205/205/205 1110 | f 285/285/285 37/37/37 206/206/206 1111 | f 209/209/209 206/206/206 77/77/77 1112 | f 50/50/50 285/285/285 209/209/209 1113 | f 286/286/286 49/49/49 210/210/210 1114 | f 213/213/213 210/210/210 78/78/78 1115 | f 32/32/32 286/286/286 213/213/213 1116 | f 287/287/287 48/48/48 214/214/214 1117 | f 217/217/217 214/214/214 79/79/79 1118 | f 35/35/35 287/287/287 217/217/217 1119 | f 288/288/288 41/41/41 218/218/218 1120 | f 221/221/221 218/218/218 80/80/80 1121 | f 34/34/34 288/288/288 221/221/221 1122 | f 289/289/289 45/45/45 222/222/222 1123 | f 225/225/225 222/222/222 81/81/81 1124 | f 28/28/28 289/289/289 225/225/225 1125 | f 84/84/84 4/4/4 141/141/141 1126 | f 90/90/90 8/8/8 137/137/137 1127 | f 91/91/91 9/9/9 144/144/144 1128 | f 88/88/88 7/7/7 145/145/145 1129 | f 106/106/106 21/21/21 133/133/133 1130 | f 107/107/107 22/22/22 148/148/148 1131 | f 100/100/100 16/16/16 149/149/149 1132 | f 110/110/110 20/20/20 132/132/132 1133 | f 111/111/111 23/23/23 152/152/152 1134 | f 103/103/103 19/19/19 153/153/153 1135 | f 114/114/114 13/13/13 125/125/125 1136 | f 115/115/115 24/24/24 156/156/156 1137 | f 102/102/102 18/18/18 157/157/157 1138 | f 118/118/118 17/17/17 129/129/129 1139 | f 119/119/119 25/25/25 160/160/160 1140 | f 96/96/96 12/12/12 161/161/161 1141 | f 162/162/162 65/65/65 121/121/121 1142 | f 163/163/163 66/66/66 164/164/164 1143 | f 136/136/136 40/40/40 165/165/165 1144 | f 166/166/166 64/64/64 120/120/120 1145 | f 167/167/167 67/67/67 168/168/168 1146 | f 159/159/159 63/63/63 169/169/169 1147 | f 170/170/170 33/33/33 89/89/89 1148 | f 171/171/171 68/68/68 172/172/172 1149 | f 158/158/158 62/62/62 173/173/173 1150 | f 174/174/174 61/61/61 117/117/117 1151 | f 175/175/175 69/69/69 176/176/176 1152 | f 142/142/142 46/46/46 177/177/177 1153 | f 178/178/178 60/60/60 116/116/116 1154 | f 179/179/179 70/70/70 180/180/180 1155 | f 155/155/155 59/59/59 181/181/181 1156 | f 182/182/182 29/29/29 85/85/85 1157 | f 183/183/183 71/71/71 184/184/184 1158 | f 154/154/154 58/58/58 185/185/185 1159 | f 186/186/186 57/57/57 113/113/113 1160 | f 187/187/187 72/72/72 188/188/188 1161 | f 143/143/143 47/47/47 189/189/189 1162 | f 190/190/190 56/56/56 112/112/112 1163 | f 191/191/191 73/73/73 192/192/192 1164 | f 151/151/151 55/55/55 193/193/193 1165 | f 194/194/194 36/36/36 92/92/92 1166 | f 195/195/195 74/74/74 196/196/196 1167 | f 150/150/150 54/54/54 197/197/197 1168 | f 198/198/198 53/53/53 109/109/109 1169 | f 199/199/199 75/75/75 200/200/200 1170 | f 140/140/140 44/44/44 201/201/201 1171 | f 202/202/202 52/52/52 108/108/108 1172 | f 203/203/203 76/76/76 204/204/204 1173 | f 147/147/147 51/51/51 205/205/205 1174 | f 206/206/206 37/37/37 93/93/93 1175 | f 207/207/207 77/77/77 208/208/208 1176 | f 146/146/146 50/50/50 209/209/209 1177 | f 210/210/210 49/49/49 105/105/105 1178 | f 211/211/211 78/78/78 212/212/212 1179 | f 128/128/128 32/32/32 213/213/213 1180 | f 214/214/214 48/48/48 104/104/104 1181 | f 215/215/215 79/79/79 216/216/216 1182 | f 131/131/131 35/35/35 217/217/217 1183 | f 218/218/218 41/41/41 97/97/97 1184 | f 219/219/219 80/80/80 220/220/220 1185 | f 130/130/130 34/34/34 221/221/221 1186 | f 222/222/222 45/45/45 101/101/101 1187 | f 223/223/223 81/81/81 224/224/224 1188 | f 124/124/124 28/28/28 225/225/225 1189 | f 226/226/226 225/225/225 81/81/81 1190 | f 161/161/161 226/226/226 223/223/223 1191 | f 12/12/12 124/124/124 226/226/226 1192 | f 227/227/227 224/224/224 62/62/62 1193 | f 121/121/121 227/227/227 158/158/158 1194 | f 65/65/65 223/223/223 227/227/227 1195 | f 228/228/228 101/101/101 17/17/17 1196 | f 224/224/224 228/228/228 118/118/118 1197 | f 81/81/81 222/222/222 228/228/228 1198 | f 229/229/229 221/221/221 80/80/80 1199 | f 157/157/157 229/229/229 219/219/219 1200 | f 18/18/18 130/130/130 229/229/229 1201 | f 230/230/230 220/220/220 58/58/58 1202 | f 117/117/117 230/230/230 154/154/154 1203 | f 61/61/61 219/219/219 230/230/230 1204 | f 231/231/231 97/97/97 13/13/13 1205 | f 220/220/220 231/231/231 114/114/114 1206 | f 80/80/80 218/218/218 231/231/231 1207 | f 232/232/232 217/217/217 79/79/79 1208 | f 153/153/153 232/232/232 215/215/215 1209 | f 19/19/19 131/131/131 232/232/232 1210 | f 233/233/233 216/216/216 54/54/54 1211 | f 113/113/113 233/233/233 150/150/150 1212 | f 57/57/57 215/215/215 233/233/233 1213 | f 234/234/234 104/104/104 20/20/20 1214 | f 216/216/216 234/234/234 110/110/110 1215 | f 79/79/79 214/214/214 234/234/234 1216 | f 235/235/235 213/213/213 78/78/78 1217 | f 149/149/149 235/235/235 211/211/211 1218 | f 16/16/16 128/128/128 235/235/235 1219 | f 236/236/236 212/212/212 50/50/50 1220 | f 109/109/109 236/236/236 146/146/146 1221 | f 53/53/53 211/211/211 236/236/236 1222 | f 237/237/237 105/105/105 21/21/21 1223 | f 212/212/212 237/237/237 106/106/106 1224 | f 78/78/78 210/210/210 237/237/237 1225 | f 238/238/238 209/209/209 77/77/77 1226 | f 148/148/148 238/238/238 207/207/207 1227 | f 22/22/22 146/146/146 238/238/238 1228 | f 239/239/239 208/208/208 35/35/35 1229 | f 108/108/108 239/239/239 131/131/131 1230 | f 52/52/52 207/207/207 239/239/239 1231 | f 240/240/240 93/93/93 9/9/9 1232 | f 208/208/208 240/240/240 91/91/91 1233 | f 77/77/77 206/206/206 240/240/240 1234 | f 241/241/241 205/205/205 76/76/76 1235 | f 95/95/95 241/241/241 203/203/203 1236 | f 11/11/11 147/147/147 241/241/241 1237 | f 242/242/242 204/204/204 47/47/47 1238 | f 135/135/135 242/242/242 143/143/143 1239 | f 39/39/39 203/203/203 242/242/242 1240 | f 243/243/243 108/108/108 19/19/19 1241 | f 204/204/204 243/243/243 103/103/103 1242 | f 76/76/76 202/202/202 243/243/243 1243 | f 244/244/244 201/201/201 75/75/75 1244 | f 83/83/83 244/244/244 199/199/199 1245 | f 2/2/2 140/140/140 244/244/244 1246 | f 245/245/245 200/200/200 51/51/51 1247 | f 123/123/123 245/245/245 147/147/147 1248 | f 27/27/27 199/199/199 245/245/245 1249 | f 246/246/246 109/109/109 22/22/22 1250 | f 200/200/200 246/246/246 107/107/107 1251 | f 75/75/75 198/198/198 246/246/246 1252 | f 247/247/247 197/197/197 74/74/74 1253 | f 152/152/152 247/247/247 195/195/195 1254 | f 23/23/23 150/150/150 247/247/247 1255 | f 248/248/248 196/196/196 38/38/38 1256 | f 112/112/112 248/248/248 94/94/94 1257 | f 56/56/56 195/195/195 248/248/248 1258 | f 249/249/249 92/92/92 5/5/5 1259 | f 196/196/196 249/249/249 134/134/134 1260 | f 74/74/74 194/194/194 249/249/249 1261 | f 250/250/250 193/193/193 73/73/73 1262 | f 99/99/99 250/250/250 191/191/191 1263 | f 15/15/15 151/151/151 250/250/250 1264 | f 251/251/251 192/192/192 26/26/26 1265 | f 139/139/139 251/251/251 82/82/82 1266 | f 43/43/43 191/191/191 251/251/251 1267 | f 252/252/252 112/112/112 10/10/10 1268 | f 192/192/192 252/252/252 122/122/122 1269 | f 73/73/73 190/190/190 252/252/252 1270 | f 253/253/253 189/189/189 72/72/72 1271 | f 87/87/87 253/253/253 187/187/187 1272 | f 6/6/6 143/143/143 253/253/253 1273 | f 254/254/254 188/188/188 55/55/55 1274 | f 127/127/127 254/254/254 151/151/151 1275 | f 31/31/31 187/187/187 254/254/254 1276 | f 255/255/255 113/113/113 23/23/23 1277 | f 188/188/188 255/255/255 111/111/111 1278 | f 72/72/72 186/186/186 255/255/255 1279 | f 256/256/256 185/185/185 71/71/71 1280 | f 156/156/156 256/256/256 183/183/183 1281 | f 24/24/24 154/154/154 256/256/256 1282 | f 257/257/257 184/184/184 42/42/42 1283 | f 116/116/116 257/257/257 98/98/98 1284 | f 60/60/60 183/183/183 257/257/257 1285 | f 258/258/258 85/85/85 3/3/3 1286 | f 184/184/184 258/258/258 138/138/138 1287 | f 71/71/71 182/182/182 258/258/258 1288 | f 259/259/259 181/181/181 70/70/70 1289 | f 132/132/132 259/259/259 179/179/179 1290 | f 20/20/20 155/155/155 259/259/259 1291 | f 260/260/260 180/180/180 30/30/30 1292 | f 92/92/92 260/260/260 86/86/86 1293 | f 36/36/36 179/179/179 260/260/260 1294 | f 261/261/261 116/116/116 14/14/14 1295 | f 180/180/180 261/261/261 126/126/126 1296 | f 70/70/70 178/178/178 261/261/261 1297 | f 262/262/262 177/177/177 69/69/69 1298 | f 144/144/144 262/262/262 175/175/175 1299 | f 9/9/9 142/142/142 262/262/262 1300 | f 263/263/263 176/176/176 59/59/59 1301 | f 104/104/104 263/263/263 155/155/155 1302 | f 48/48/48 175/175/175 263/263/263 1303 | f 264/264/264 117/117/117 24/24/24 1304 | f 176/176/176 264/264/264 115/115/115 1305 | f 69/69/69 174/174/174 264/264/264 1306 | f 265/265/265 173/173/173 68/68/68 1307 | f 160/160/160 265/265/265 171/171/171 1308 | f 25/25/25 158/158/158 265/265/265 1309 | f 266/266/266 172/172/172 34/34/34 1310 | f 120/120/120 266/266/266 130/130/130 1311 | f 64/64/64 171/171/171 266/266/266 1312 | f 267/267/267 89/89/89 8/8/8 1313 | f 172/172/172 267/267/267 90/90/90 1314 | f 68/68/68 170/170/170 267/267/267 1315 | f 268/268/268 169/169/169 67/67/67 1316 | f 133/133/133 268/268/268 167/167/167 1317 | f 21/21/21 159/159/159 268/268/268 1318 | f 269/269/269 168/168/168 46/46/46 1319 | f 93/93/93 269/269/269 142/142/142 1320 | f 37/37/37 167/167/167 269/269/269 1321 | f 270/270/270 120/120/120 18/18/18 1322 | f 168/168/168 270/270/270 102/102/102 1323 | f 67/67/67 166/166/166 270/270/270 1324 | f 271/271/271 165/165/165 66/66/66 1325 | f 145/145/145 271/271/271 163/163/163 1326 | f 7/7/7 136/136/136 271/271/271 1327 | f 272/272/272 164/164/164 63/63/63 1328 | f 105/105/105 272/272/272 159/159/159 1329 | f 49/49/49 163/163/163 272/272/272 1330 | f 273/273/273 121/121/121 25/25/25 1331 | f 164/164/164 273/273/273 119/119/119 1332 | f 66/66/66 162/162/162 273/273/273 1333 | f 274/274/274 161/161/161 65/65/65 1334 | f 165/165/165 274/274/274 162/162/162 1335 | f 40/40/40 96/96/96 274/274/274 1336 | f 275/275/275 160/160/160 64/64/64 1337 | f 169/169/169 275/275/275 166/166/166 1338 | f 63/63/63 119/119/119 275/275/275 1339 | f 276/276/276 129/129/129 33/33/33 1340 | f 173/173/173 276/276/276 170/170/170 1341 | f 62/62/62 118/118/118 276/276/276 1342 | f 277/277/277 157/157/157 61/61/61 1343 | f 177/177/177 277/277/277 174/174/174 1344 | f 46/46/46 102/102/102 277/277/277 1345 | f 278/278/278 156/156/156 60/60/60 1346 | f 181/181/181 278/278/278 178/178/178 1347 | f 59/59/59 115/115/115 278/278/278 1348 | f 279/279/279 125/125/125 29/29/29 1349 | f 185/185/185 279/279/279 182/182/182 1350 | f 58/58/58 114/114/114 279/279/279 1351 | f 280/280/280 153/153/153 57/57/57 1352 | f 189/189/189 280/280/280 186/186/186 1353 | f 47/47/47 103/103/103 280/280/280 1354 | f 281/281/281 152/152/152 56/56/56 1355 | f 193/193/193 281/281/281 190/190/190 1356 | f 55/55/55 111/111/111 281/281/281 1357 | f 282/282/282 132/132/132 36/36/36 1358 | f 197/197/197 282/282/282 194/194/194 1359 | f 54/54/54 110/110/110 282/282/282 1360 | f 283/283/283 149/149/149 53/53/53 1361 | f 201/201/201 283/283/283 198/198/198 1362 | f 44/44/44 100/100/100 283/283/283 1363 | f 284/284/284 148/148/148 52/52/52 1364 | f 205/205/205 284/284/284 202/202/202 1365 | f 51/51/51 107/107/107 284/284/284 1366 | f 285/285/285 133/133/133 37/37/37 1367 | f 209/209/209 285/285/285 206/206/206 1368 | f 50/50/50 106/106/106 285/285/285 1369 | f 286/286/286 145/145/145 49/49/49 1370 | f 213/213/213 286/286/286 210/210/210 1371 | f 32/32/32 88/88/88 286/286/286 1372 | f 287/287/287 144/144/144 48/48/48 1373 | f 217/217/217 287/287/287 214/214/214 1374 | f 35/35/35 91/91/91 287/287/287 1375 | f 288/288/288 137/137/137 41/41/41 1376 | f 221/221/221 288/288/288 218/218/218 1377 | f 34/34/34 90/90/90 288/288/288 1378 | f 289/289/289 141/141/141 45/45/45 1379 | f 225/225/225 289/289/289 222/222/222 1380 | f 28/28/28 84/84/84 289/289/289 1381 | -------------------------------------------------------------------------------- /demo/landscape/tangents.x3d: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /demo/lib/styles.css: -------------------------------------------------------------------------------- 1 | body, html, x3d 2 | { 3 | padding:0; 4 | margin:0; 5 | border:none; 6 | width:100%; 7 | height:100% 8 | } 9 | 10 | body 11 | { 12 | background:#888888; 13 | background: linear-gradient(white, #E1EDF7); 14 | overflow:hidden; 15 | } 16 | -------------------------------------------------------------------------------- /demo/lib/x3dom.css: -------------------------------------------------------------------------------- 1 | /* 2 | * X3DOM JavaScript Library 3 | * http://www.x3dom.org 4 | * 5 | * (C)2009 Fraunhofer IGD, Darmstadt, Germany 6 | * Dual licensed under the MIT and GPL 7 | * 8 | * Based on code originally provided by 9 | * Philip Taylor: http://philip.html5.org 10 | */ 11 | 12 | X3D, x3d { 13 | position:relative; /* in order to be able to position stat-div within X3D */ 14 | float:left; /* float the element so it has the same size like the canvas */ 15 | cursor:pointer; 16 | margin: 0; 17 | padding: 0; 18 | border: 1px solid #000; 19 | } 20 | 21 | object { 22 | margin: 0; 23 | padding: 0; 24 | border: none; 25 | z-index: 0; 26 | width:100%; 27 | height:100%; 28 | float:left; 29 | } 30 | 31 | X3D:hover, 32 | x3d:hover, 33 | .x3dom-canvas:hover { 34 | -webkit-user-select: none; 35 | -webkit-touch-callout: none; 36 | } 37 | 38 | .x3dom-canvas { 39 | border:none; 40 | cursor:pointer; 41 | cursor:-webkit-grab; 42 | cursor:grab; 43 | width:100%; 44 | height:100%; 45 | float:left; 46 | } 47 | 48 | .x3dom-canvas-mousedown { 49 | cursor:-webkit-grabbing; 50 | cursor:grabbing; 51 | } 52 | 53 | .x3dom-canvas:focus { 54 | outline:none; 55 | } 56 | .x3dom-progress { 57 | margin: 0; 58 | padding: 6px 8px 0px 26px; 59 | left: 0px; 60 | top: 0px; 61 | position: absolute; 62 | color: #0f0; 63 | font-family: Helvetica, sans-serif; 64 | line-height:10px; 65 | font-size: 10px; 66 | min-width: 45px; 67 | min-height: 20px; 68 | border: 0px; 69 | background-position: 4px 4px; 70 | background-repeat: no-repeat; 71 | background-color: #333; 72 | background-color: rgba(51, 51, 51, 0.9); 73 | z-index: 100; 74 | background-image: url('data:image/gif;base64,R0lGODlhEAAQAPQAADMzM////z4+Po+Pj0pKSsbGxpycnP///7e3t+Hh4XR0dGZmZu7u7oGBgfr6+tLS0qqqqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAkKAAAALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQJCgAAACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQJCgAAACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkECQoAAAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkECQoAAAAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAkKAAAALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAkKAAAALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQJCgAAACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQJCgAAACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA=='); 75 | } 76 | 77 | .x3dom-progress.bar span { 78 | position: absolute; 79 | left: 0; 80 | top: 0; 81 | line-height: 20px; 82 | background-color: red; 83 | } 84 | 85 | 86 | .x3dom-statdiv { 87 | margin: 0; 88 | padding: 0; 89 | right: 10px; 90 | top: 10px; 91 | position: absolute; 92 | color: #0f0; 93 | font-family: Helvetica, sans-serif; 94 | line-height:10px; 95 | font-size: 10px; 96 | width: 75px; 97 | height: 70px; 98 | border: 0px; 99 | } 100 | 101 | #x3dom-state-canvas { 102 | margin: 2px; 103 | padding: 0; 104 | right: 0%; 105 | top: 0%; 106 | position: absolute; 107 | } 108 | 109 | #x3dom-state-viewer { 110 | position: absolute; 111 | margin: 2px; 112 | padding: 5px; 113 | width: 135px; 114 | top: 0%; 115 | right: 0%; 116 | opacity: 0.9; 117 | background-color: #323232; 118 | z-index: 1000; 119 | font-family: Arial, sans-serif; 120 | color: #C8C8C8; 121 | font-weight: bold; 122 | text-transform: uppercase; 123 | cursor: help; 124 | } 125 | 126 | .x3dom-states-head { 127 | display: block; 128 | font-size: 26px; 129 | } 130 | 131 | .x3dom-states-rendermode-software { 132 | font-size: 10px; 133 | margin: 0 0 2px 2px; 134 | } 135 | 136 | .x3dom-states-rendermode-hardware { 137 | font-size: 10px; 138 | margin: 0 0 2px 2px; 139 | } 140 | 141 | .x3dom-states-head2 { 142 | font-size: 10px; 143 | } 144 | 145 | .x3dom-states-list { 146 | float: left; 147 | width: 100%; 148 | border-top: 1px solid #C8C8C8; 149 | list-style: none; 150 | font-size: 9px; 151 | line-height: 16px; 152 | margin:0; 153 | padding: 0; 154 | padding-top: 2px; 155 | } 156 | 157 | .x3dom-states-item { 158 | width: 100%; 159 | float: left; 160 | } 161 | 162 | .x3dom-states-item-title { 163 | float: left; 164 | margin-left: 2px; 165 | } 166 | 167 | .x3dom-states-item-value { 168 | float: right; 169 | margin-right: 2px; 170 | } 171 | 172 | .x3dom-touch-marker { 173 | display: inline; 174 | padding: 5px; 175 | border-radius: 10px; 176 | position: absolute; 177 | font-family: Helvetica, sans-serif; 178 | line-height:10px; 179 | font-size: 10px; 180 | color: darkorange; 181 | background: cornsilk; 182 | opacity: 0.6; 183 | border: 2px solid orange; 184 | z-index: 200; 185 | } 186 | 187 | .x3dom-logContainer { 188 | border: 2px solid olivedrab; 189 | height: 200px; 190 | padding: 4px; 191 | overflow: auto; 192 | white-space: pre-wrap; 193 | font-family: sans-serif; 194 | font-size: x-small; 195 | color: #00ff00; 196 | background-color: black; 197 | margin-right: 10px; 198 | } 199 | 200 | .x3dom-nox3d { 201 | font-family: Helvetica, sans-serif; 202 | font-size: 14px; 203 | background-color: #eb7a7a; 204 | padding: 1em; 205 | opacity: 0.75; 206 | } 207 | 208 | .x3dom-nox3d p { 209 | color: #fff; 210 | font-size: 14px; 211 | } 212 | 213 | .x3dom-nox3d a { 214 | color: #fff; 215 | font-size: 14px; 216 | } 217 | 218 | 219 | /* self-clearing floats */ 220 | .group:after { 221 | content: "."; 222 | display: block; 223 | height: 0; 224 | clear: both; 225 | visibility: hidden; 226 | } 227 | -------------------------------------------------------------------------------- /demo/victor/baked/NormalsTS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/demo/victor/baked/NormalsTS.png -------------------------------------------------------------------------------- /demo/victor/checker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/demo/victor/checker.png -------------------------------------------------------------------------------- /demo/victor/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Tangent Frames 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /images/landscape-details.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/images/landscape-details.jpg -------------------------------------------------------------------------------- /images/landscape-normalmap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/images/landscape-normalmap.jpg -------------------------------------------------------------------------------- /images/landscape-tangents.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/images/landscape-tangents.jpg -------------------------------------------------------------------------------- /images/victor-details.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/images/victor-details.jpg -------------------------------------------------------------------------------- /images/victor-normalmap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/images/victor-normalmap.jpg -------------------------------------------------------------------------------- /images/victor-tangents.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mlimper/tgen/a6a44840946604c600abb6aa7cf0bf6d0ac71261/images/victor-tangents.jpg -------------------------------------------------------------------------------- /src/tgen.cpp: -------------------------------------------------------------------------------- 1 | /** 2 | * TGen - Simple Tangent Generator 3 | * 4 | * 2016 by Max Limper, Fraunhofer IGD 5 | * 6 | * This code is public domain. 7 | * 8 | */ 9 | 10 | #include "tgen.h" 11 | #include 12 | 13 | 14 | // local utility definitions 15 | namespace 16 | { 17 | const tgen::RealT DenomEps = 1e-10; 18 | 19 | //------------------------------------------------------------------------- 20 | 21 | inline void addVec3(const tgen::RealT * a, 22 | const tgen::RealT * b, 23 | tgen::RealT * result) 24 | { 25 | result[0] = a[0] + b[0]; 26 | result[1] = a[1] + b[1]; 27 | result[2] = a[2] + b[2]; 28 | } 29 | 30 | //------------------------------------------------------------------------- 31 | 32 | inline void subVec3(const tgen::RealT * a, 33 | const tgen::RealT * b, 34 | tgen::RealT * result) 35 | { 36 | result[0] = a[0] - b[0]; 37 | result[1] = a[1] - b[1]; 38 | result[2] = a[2] - b[2]; 39 | } 40 | 41 | //------------------------------------------------------------------------- 42 | 43 | inline void multVec3(const tgen::RealT * a, 44 | const tgen::RealT s, 45 | tgen::RealT * result) 46 | { 47 | result[0] = a[0] * s; 48 | result[1] = a[1] * s; 49 | result[2] = a[2] * s; 50 | } 51 | 52 | //------------------------------------------------------------------------- 53 | 54 | void normalizeVec3(tgen::RealT * v) 55 | { 56 | tgen::RealT len = std::sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); 57 | 58 | multVec3(v, 1.0 / len, v); 59 | } 60 | 61 | //------------------------------------------------------------------------- 62 | 63 | inline tgen::RealT dotProd(const tgen::RealT * a, 64 | const tgen::RealT * b ) 65 | { 66 | return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; 67 | } 68 | 69 | //------------------------------------------------------------------------- 70 | 71 | inline void crossProd(const tgen::RealT * a, 72 | const tgen::RealT * b, 73 | tgen::RealT * result) 74 | { 75 | result[0] = a[1] * b[2] - a[2] * b[1]; 76 | result[1] = a[2] * b[0] - a[0] * b[2]; 77 | result[2] = a[0] * b[1] - a[1] * b[0]; 78 | } 79 | 80 | //------------------------------------------------------------------------- 81 | 82 | inline void subVec2(const tgen::RealT * a, 83 | const tgen::RealT * b, 84 | tgen::RealT * result) 85 | { 86 | result[0] = a[0] - b[0]; 87 | result[1] = a[1] - b[1]; 88 | } 89 | 90 | } //anonymous namespace 91 | 92 | 93 | namespace tgen 94 | { 95 | 96 | //------------------------------------------------------------------------- 97 | 98 | void computeCornerTSpace(const std::vector & triIndicesPos, 99 | const std::vector & triIndicesUV, 100 | const std::vector & positions3D, 101 | const std::vector & uvs2D, 102 | std::vector & cTangents3D, 103 | std::vector & cBitangents3D) 104 | { 105 | const std::size_t numCorners = triIndicesPos.size(); 106 | 107 | cTangents3D.resize( numCorners * 3); 108 | cBitangents3D.resize(numCorners * 3); 109 | 110 | RealT edge3D[3][3], edgeUV[3][2], 111 | tmp0[3], tmp1[3]; 112 | 113 | for (std::size_t i = 0; i < triIndicesPos.size(); i += 3) 114 | { 115 | const VIndexT vertexIndicesPos[3] = { triIndicesPos[i ], 116 | triIndicesPos[i+1], 117 | triIndicesPos[i+2] }; 118 | 119 | const VIndexT vertexIndicesUV[3] = { triIndicesUV[i ], 120 | triIndicesUV[i+1], 121 | triIndicesUV[i+2] }; 122 | 123 | // compute derivatives of positions and UVs along the edges 124 | for (std::size_t j = 0; j < 3; ++j) 125 | { 126 | const std::size_t next = (j + 1) % 3; 127 | 128 | const VIndexT v0PosIdx = vertexIndicesPos[j]; 129 | const VIndexT v1PosIdx = vertexIndicesPos[next]; 130 | const VIndexT v0UVIdx = vertexIndicesUV[j]; 131 | const VIndexT v1UVIdx = vertexIndicesUV[next]; 132 | 133 | subVec3(&positions3D[v1PosIdx * 3], 134 | &positions3D[v0PosIdx * 3], 135 | edge3D[j]); 136 | 137 | subVec2(&uvs2D[v1UVIdx * 2], 138 | &uvs2D[v0UVIdx * 2], 139 | edgeUV[j]); 140 | } 141 | 142 | // compute per-corner tangent and bitangent (not normalized), 143 | // using the derivatives of the UVs 144 | // http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping/ 145 | for (std::size_t j = 0; j < 3; ++j) 146 | { 147 | const std::size_t prev = (j + 2) % 3; 148 | 149 | const RealT * dPos0 = edge3D[j]; 150 | const RealT * dPos1Neg = edge3D[prev]; 151 | const RealT * dUV0 = edgeUV[j]; 152 | const RealT * dUV1Neg = edgeUV[prev]; 153 | 154 | RealT * resultTangent = &cTangents3D[ (i + j) * 3]; 155 | RealT * resultBitangent = &cBitangents3D[(i + j) * 3]; 156 | 157 | RealT denom = (dUV0[0] * -dUV1Neg[1] - dUV0[1] * -dUV1Neg[0]); 158 | RealT r = std::abs(denom) > DenomEps ? 1.0 / denom : 0.0; 159 | 160 | multVec3(dPos0, -dUV1Neg[1] * r, tmp0); 161 | multVec3(dPos1Neg, -dUV0[1] * r, tmp1); 162 | subVec3(tmp0, tmp1, resultTangent); 163 | 164 | multVec3(dPos1Neg, -dUV0[0] * r, tmp0); 165 | multVec3(dPos0, -dUV1Neg[0] * r, tmp1); 166 | subVec3(tmp0, tmp1, resultBitangent); 167 | } 168 | } 169 | } 170 | 171 | //------------------------------------------------------------------------- 172 | 173 | void computeVertexTSpace(const std::vector & triIndicesUV, 174 | const std::vector & cTangents3D, 175 | const std::vector & cBitangents3D, 176 | std::size_t numUVVertices, 177 | std::vector & vTangents3D, 178 | std::vector & vBitangents3D ) 179 | { 180 | vTangents3D.resize( numUVVertices * 3, 0.0); 181 | vBitangents3D.resize(numUVVertices * 3, 0.0); 182 | 183 | 184 | // average tangent vectors for each "wedge" (UV vertex) 185 | // this assumes that we do not use different vertex positions 186 | // for the same UV coordinate (example: mirrored parts) 187 | 188 | for (std::size_t i = 0; i < triIndicesUV.size(); ++i) 189 | { 190 | const VIndexT uvIdx = triIndicesUV[i]; 191 | 192 | RealT * cornerTangent = &vTangents3D[ uvIdx*3]; 193 | RealT * cornerBitangent = &vBitangents3D[uvIdx*3]; 194 | 195 | addVec3(&cTangents3D[ i*3], cornerTangent, cornerTangent ); 196 | addVec3(&cBitangents3D[i*3], cornerBitangent, cornerBitangent); 197 | } 198 | 199 | 200 | // normalize results 201 | 202 | for (VIndexT i = 0; i < numUVVertices; ++i) 203 | { 204 | normalizeVec3(&vTangents3D[ i * 3]); 205 | normalizeVec3(&vBitangents3D[i * 3]); 206 | } 207 | } 208 | 209 | //------------------------------------------------------------------------- 210 | 211 | void orthogonalizeTSpace(const std::vector & normals3D, 212 | std::vector & tangents3D, 213 | std::vector & bitangents3D) 214 | { 215 | const std::size_t numVertices = normals3D.size() / 3; 216 | 217 | RealT correction[3]; 218 | for (VIndexT i = 0; i < numVertices; ++i) 219 | { 220 | const RealT * nV = &normals3D[ i*3]; 221 | 222 | RealT * bV = &bitangents3D[i*3]; 223 | RealT * tV = &tangents3D[i*3]; 224 | 225 | RealT d = dotProd(nV, tV); 226 | 227 | multVec3(nV, d, correction); 228 | subVec3(tV, correction, tV); 229 | normalizeVec3(tV); 230 | 231 | crossProd(nV, tV, bV); 232 | } 233 | } 234 | 235 | //------------------------------------------------------------------------- 236 | 237 | void computeTangent4D(const std::vector & normals3D, 238 | const std::vector & tangents3D, 239 | const std::vector & bitangents3D, 240 | std::vector & tangents4D) 241 | { 242 | const std::size_t numVertices = normals3D.size() / 3; 243 | 244 | tangents4D.resize(numVertices * 4); 245 | 246 | RealT cross[3]; 247 | for (VIndexT i = 0; i < numVertices; ++i) 248 | { 249 | crossProd(&normals3D[i*3], &tangents3D[i*3], cross); 250 | 251 | RealT sign = dotProd(cross, &bitangents3D[i*3]) > 0.0 ? 1.0 : -1.0; 252 | 253 | tangents4D[i*4 ] = tangents3D[i*3+0]; 254 | tangents4D[i*4+1] = tangents3D[i*3+1]; 255 | tangents4D[i*4+2] = tangents3D[i*3+2]; 256 | tangents4D[i*4+3] = sign; 257 | } 258 | } 259 | 260 | //------------------------------------------------------------------------- 261 | 262 | } //namespace tgen 263 | -------------------------------------------------------------------------------- /src/tgen.h: -------------------------------------------------------------------------------- 1 | /** 2 | * TGen - Simple Tangent Generator 3 | * 4 | * 2016 by Max Limper, Fraunhofer IGD 5 | * 6 | * This code is public domain. 7 | * 8 | */ 9 | 10 | #ifndef TGEN_H 11 | #define TGEN_H 12 | 13 | #include 14 | #include 15 | 16 | 17 | namespace tgen 18 | { 19 | 20 | //------------------------------------------------------------------------- 21 | 22 | typedef std::size_t VIndexT; 23 | typedef double RealT; 24 | 25 | //------------------------------------------------------------------------- 26 | 27 | /** 28 | * Computes tangents and bitangents for each corner of a triangle. 29 | * In an indexed triangle list, each entry corresponds to one corner. 30 | * 31 | * Requirements for input: 32 | * - triIndicesPos and triIndicesUV must be of the same size 33 | * - triIndicesPos refers to (at maximum) num3DVertices different elements 34 | * - triIndicesUV refers to (at maximum) numUVVertices different elements 35 | * - positions3D must have a size of num3DVertices*3 36 | * - uvs2D must have a size of numUVVertices*2 37 | * 38 | * Output: 39 | * - cTangents3D has numTriIndices*3 entries, contains per-corner tangents 40 | * - cBitangents3D has numTriIndices*3 entries, contains per-corner bitangents 41 | */ 42 | void computeCornerTSpace(const std::vector & triIndicesPos, 43 | const std::vector & triIndicesUV, 44 | const std::vector & positions3D, 45 | const std::vector & uvs2D, 46 | std::vector & cTangents3D, 47 | std::vector & cBitangents3D); 48 | 49 | //------------------------------------------------------------------------- 50 | 51 | /** 52 | * Computes per-vertex tangents and bitangents, for each UV vertex. 53 | * This is done by averaging vectors across each wedge (all vertex instances 54 | * sharing a common UV vertex). 55 | * 56 | * The basic method used here currently makes the assumption that UV 57 | * vertices are not being re-used across multiple 3D vertices. 58 | * However, the multi-indexed structure used here allows a single 3D vertex 59 | * to be split in UV space (to enable usage of UV charts without explicitly 60 | * cutting / splitting the 3D mesh). 61 | * 62 | * Requirements about input: 63 | * - triIndicesUV refers to (at maximum) numUVVertices different elements 64 | * - cTangents3D has numTriIndices*3 entries, contains per-corner tangents 65 | * - cBitangents3D has numTriIndices*3 entries, contains per-corner bitangents 66 | * 67 | * Output: 68 | * - vTangents3D has numUVVertices*3 entries 69 | * - vBitangents3D has numUVVertices*3 entries 70 | */ 71 | void computeVertexTSpace(const std::vector & triIndicesUV, 72 | const std::vector & cTangents3D, 73 | const std::vector & cBitangents3D, 74 | std::size_t numUVVertices, 75 | std::vector & vTangents3D, 76 | std::vector & vBitangents3D); 77 | 78 | //------------------------------------------------------------------------- 79 | 80 | /** 81 | * Makes the given tangent frames orthogonal. 82 | * 83 | * Input arrays must have the same number of (numUVVertices*3) elements. 84 | */ 85 | void orthogonalizeTSpace(const std::vector & normals3D, 86 | std::vector & tangents3D, 87 | std::vector & bitangents3D); 88 | 89 | //------------------------------------------------------------------------- 90 | 91 | /** 92 | * Makes the given tangent frames orthogonal. 93 | * 94 | * Input arrays must have the same number of (numUVVertices*3) elements. 95 | * 96 | * The output will be an array with 4-component versions of the tangents, 97 | * where the first three components are equivalent to the input tangents 98 | * and the fourth component contains a factor for flipping a computed 99 | * bitangent, if the original tangent frame was right-handed. 100 | * Concretely speaking, the 3D bitangent can be obtained as: 101 | * bitangent = tangent4.w * (normal.cross(tangent4.xyz)) 102 | */ 103 | void computeTangent4D(const std::vector & normals3D, 104 | const std::vector & tangents3D, 105 | const std::vector & bitangents3D, 106 | std::vector & tangents4D); 107 | 108 | //------------------------------------------------------------------------- 109 | 110 | } 111 | 112 | #endif //TGEN_H 113 | -------------------------------------------------------------------------------- /src/tgen_debug.cpp: -------------------------------------------------------------------------------- 1 | #include "tgen_debug.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | 9 | // local utility definitions 10 | namespace 11 | { 12 | 13 | //------------------------------------------------------------------------- 14 | 15 | void writeX3DTriIndexArray(const std::vector & elements, 16 | std::stringstream & ss) 17 | { 18 | if (elements.empty()) 19 | { 20 | return; 21 | } 22 | 23 | ss << elements[0]; 24 | 25 | for (std::size_t i = 1; i < elements.size(); ++i) 26 | { 27 | ss << " " << elements[i]; 28 | 29 | if (i % 3 == 2) 30 | { 31 | ss << " -1"; 32 | } 33 | } 34 | } 35 | 36 | //------------------------------------------------------------------------- 37 | 38 | void writeX3DArray(const std::vector & elements, 39 | std::stringstream & ss) 40 | { 41 | if (elements.empty()) 42 | { 43 | return; 44 | } 45 | 46 | ss << elements[0]; 47 | 48 | for (std::size_t i = 1; i < elements.size(); ++i) 49 | { 50 | ss << " " << elements[i]; 51 | } 52 | } 53 | 54 | //------------------------------------------------------------------------- 55 | 56 | void writeX3DLinesVCount(std::size_t numLines, std::stringstream & ss) 57 | { 58 | if (numLines == 0) 59 | { 60 | return; 61 | } 62 | 63 | ss << "2"; 64 | 65 | for (std::size_t i = 1; i < numLines; ++i) 66 | { 67 | ss << " 2"; 68 | } 69 | } 70 | 71 | //------------------------------------------------------------------------- 72 | 73 | void writeX3DVecFieldLineData(const std::vector & pos3D, 74 | const std::vector & dir3D, 75 | double vScale, 76 | std::stringstream & ss) 77 | { 78 | if (pos3D.empty()) 79 | { 80 | return; 81 | } 82 | 83 | ss << pos3D[0] << " " << pos3D[1] << " " << pos3D[2] << " " << 84 | pos3D[0] + vScale * dir3D[0] << " " << 85 | pos3D[1] + vScale * dir3D[1] << " " << 86 | pos3D[2] + vScale * dir3D[2]; 87 | 88 | for (std::size_t i = 3; i < pos3D.size(); i += 3) 89 | { 90 | ss << " "; 91 | ss << pos3D[i] << " " << pos3D[i+1] << " " << pos3D[i+2] << " " << 92 | pos3D[i] + vScale * dir3D[i] << " " << 93 | pos3D[i+1] + vScale * dir3D[i+1] << " " << 94 | pos3D[i+2] + vScale * dir3D[i+2]; 95 | } 96 | } 97 | 98 | //------------------------------------------------------------------------- 99 | 100 | void writeX3DVecFieldVis(const std::vector & pos3D, 101 | const std::vector & dir3D, 102 | const std::string & colorStr, 103 | double vScale, 104 | std::stringstream & ss ) 105 | { 106 | ss << " " << std::endl; 107 | ss << " " << std::endl; 108 | ss << " " 109 | << std::endl; 110 | ss << " " << std::endl; 111 | ss << " " 114 | << std::endl; 115 | ss << " " << std::endl; 118 | ss << " " << std::endl; 119 | ss << " " << std::endl; 120 | } 121 | 122 | //------------------------------------------------------------------------- 123 | 124 | } //anonymous namespace 125 | 126 | 127 | namespace tgen 128 | { 129 | 130 | //------------------------------------------------------------------------- 131 | 132 | void dumpDebugX3D(const std::vector & triIndicesPos, 133 | const std::vector & triIndicesUV, 134 | const std::vector & positions3D, 135 | const std::vector & normals3D, 136 | const std::vector & uvs2D, 137 | const std::vector & tangents3D, 138 | const std::vector & bitangents3D, 139 | const char * filename ) 140 | { 141 | if (positions3D.empty()) 142 | { 143 | return; 144 | } 145 | 146 | 147 | // guess a reasonable scale factor that will be used to adjust the size 148 | // of the visualized vectors 149 | tgen::RealT bbMin[3], bbMax[3]; 150 | 151 | bbMin[0] = bbMax[0] = positions3D[0]; 152 | bbMin[1] = bbMax[1] = positions3D[1]; 153 | bbMin[2] = bbMax[2] = positions3D[2]; 154 | 155 | for (std::size_t i = 0; i < positions3D.size(); i += 3) 156 | { 157 | for (std::size_t j = 0; j < 3; ++j) 158 | { 159 | bbMin[j] = std::min(positions3D[i+j], bbMin[j]); 160 | bbMax[j] = std::max(positions3D[i+j], bbMax[j]); 161 | } 162 | } 163 | 164 | tgen::RealT bbDiagLen = 0; 165 | for (std::size_t i = 0; i < 3; ++i) 166 | { 167 | tgen::RealT componentSize = bbMax[i] - bbMin[i]; 168 | bbDiagLen += componentSize * componentSize; 169 | } 170 | 171 | bbDiagLen = std::sqrt(bbDiagLen); 172 | 173 | tgen::RealT vScale = bbDiagLen * 0.02; 174 | 175 | 176 | // write X3D file 177 | 178 | std::stringstream sstr; 179 | 180 | // prologue 181 | sstr << "" << std::endl; 182 | sstr << "" 184 | << std::endl; 185 | sstr << "" << std::endl; 186 | sstr << " " << std::endl; 187 | 188 | // textured object 189 | sstr << " " << std::endl; 190 | sstr << " " << std::endl; 191 | sstr << " " << std::endl; 192 | sstr << " " << std::endl; 193 | sstr << " " << std::endl; 194 | sstr << " " << std::endl; 195 | sstr << " " << std::endl; 196 | sstr << " " << std::endl; 203 | sstr << " " << std::endl; 206 | sstr << " " << std::endl; 209 | sstr << " " << std::endl; 212 | sstr << " " << std::endl; 213 | sstr << " " << std::endl; 214 | 215 | // vector field visualizations 216 | writeX3DVecFieldVis(positions3D, normals3D, "0 0 1", vScale, sstr); 217 | writeX3DVecFieldVis(positions3D, tangents3D, "1 0 0", vScale, sstr); 218 | writeX3DVecFieldVis(positions3D, bitangents3D, "0 1 0", vScale, sstr); 219 | 220 | // epilogue 221 | sstr << " " << std::endl; 222 | sstr << "" << std::endl; 223 | 224 | 225 | std::ofstream fstr("tangents.x3d"); 226 | fstr << sstr.str() << std::endl; 227 | } 228 | 229 | //------------------------------------------------------------------------- 230 | 231 | } //namespace tgen 232 | -------------------------------------------------------------------------------- /src/tgen_debug.h: -------------------------------------------------------------------------------- 1 | /** 2 | * TGen - Simple Tangent Generator 3 | * 4 | * 2016 by Max Limper, Fraunhofer IGD 5 | * 6 | * This code is public domain. 7 | * 8 | */ 9 | 10 | #ifndef TGEN_DEBUG_H 11 | #define TGEN_DEBUG_H 12 | 13 | #include "tgen.h" 14 | 15 | 16 | namespace tgen 17 | { 18 | 19 | /** 20 | * To ease debugging and visualization of results, this code writes 21 | * the mesh and the tangent space frames at each vertex to an X3D file. 22 | * 23 | * Requirements for input: 24 | * - triIndicesPos and triIndicesUV must be of the same size 25 | * - triIndicesPos refers to (at maximum) num3DVertices different elements 26 | * - triIndicesUV refers to (at maximum) numUVVertices different elements 27 | * - positions3D must have a size of num3DVertices * 3 28 | * - normals3D must have a size of numUVVertices * 3 29 | * - uvs2D must have a size of numUVVertices * 2 30 | * - tangents3D must have a size of numUVVertices * 3 31 | * - bitangents3D must have a size of numUVVertices * 3 32 | * - filename must be the name of a writeable file in an existing directory 33 | */ 34 | void dumpDebugX3D(const std::vector & triIndicesPos, 35 | const std::vector & triIndicesUV, 36 | const std::vector & positions3D, 37 | const std::vector & normals3D, 38 | const std::vector & uvs2D, 39 | const std::vector & tangents3D, 40 | const std::vector & bitangents3D, 41 | const char * filename ); 42 | 43 | //------------------------------------------------------------------------- 44 | 45 | } 46 | 47 | #endif //TGEN_DEBUG_H 48 | --------------------------------------------------------------------------------