├── 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 |
32 |
33 | [Web Demo](https://mlimper.github.io/tgen/demo/landscape/index.html)
34 |
35 |
36 | ### Victor
37 |
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 |
--------------------------------------------------------------------------------