1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
|
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
<TITLE>nevrax.org : docs</TITLE>
<LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</HEAD>
<BODY MARGINHEIGHT="0" MARGINWIDTH="0">
<!-- uplinks -->
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD>
<TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD>
</TR>
</TABLE>
<!-- banner Nevrax -->
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%>
<TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR>
</TABLE>
<!-- main table -->
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%>
<TR>
<TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD>
<TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT="">
<!------ Begin Box ------>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black>
<FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF>
<TABLE cellspacing=0 cellpadding=1 border=0>
<tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr>
</TABLE>
</TD></TR></TABLE></TD></TR></TABLE>
<!------ End Box ------>
</TD>
<TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT="">
<!-- title -->
<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td>
<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A>
</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT="">
</td></tr></table>
<!-- block -->
<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD>
<TD><B>Documentation</B></TD>
<TD ALIGN=RIGHT> </td>
</tr></table>
<!-- Generated by Doxygen 1.2.14 -->
<center>
<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center>
<hr><h1>patch_lightmap.cpp</h1><a href="patch__lightmap_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001
00007 <font class="comment">/* Copyright, 2000 Nevrax Ltd.</font>
00008 <font class="comment"> *</font>
00009 <font class="comment"> * This file is part of NEVRAX NEL.</font>
00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font>
00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font>
00013 <font class="comment"> * any later version.</font>
00014 <font class="comment"></font>
00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font>
00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font>
00018 <font class="comment"> * General Public License for more details.</font>
00019 <font class="comment"></font>
00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font>
00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font>
00023 <font class="comment"> * MA 02111-1307, USA.</font>
00024 <font class="comment"> */</font>
00025
00026
00027 <font class="preprocessor">#include "<a class="code" href="std3d_8h.html">std3d.h</a>"</font>
00028
00029
00030 <font class="preprocessor">#include "<a class="code" href="patch_8h.html">3d/patch.h</a>"</font>
00031 <font class="preprocessor">#include "<a class="code" href="tessellation_8h.html">3d/tessellation.h</a>"</font>
00032 <font class="preprocessor">#include "<a class="code" href="bezier__patch_8h.html">3d/bezier_patch.h</a>"</font>
00033 <font class="preprocessor">#include "<a class="code" href="src_23d_2zone_8h.html">3d/zone.h</a>"</font>
00034 <font class="preprocessor">#include "<a class="code" href="landscape_8h.html">3d/landscape.h</a>"</font>
00035 <font class="preprocessor">#include "<a class="code" href="vector_8h.html">nel/misc/vector.h</a>"</font>
00036 <font class="preprocessor">#include "<a class="code" href="common_8h.html">nel/misc/common.h</a>"</font>
00037 <font class="preprocessor">#include "<a class="code" href="patchuv__locator_8h.html">3d/patchuv_locator.h</a>"</font>
00038 <font class="preprocessor">#include "<a class="code" href="vegetable__manager_8h.html">3d/vegetable_manager.h</a>"</font>
00039 <font class="preprocessor">#include "<a class="code" href="fast__floor_8h.html">3d/fast_floor.h</a>"</font>
00040 <font class="preprocessor">#include "<a class="code" href="light__influence__interpolator_8h.html">3d/light_influence_interpolator.h</a>"</font>
00041 <font class="preprocessor">#include "<a class="code" href="patchdlm__context_8h.html">3d/patchdlm_context.h</a>"</font>
00042 <font class="keyword">using</font> <font class="keyword">namespace </font>std;
00043 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC;
00044
00045
00046 <font class="keyword">namespace </font>NL3D
00047 {
00048
00049
00050 <font class="comment">// ***************************************************************************</font>
00051 <font class="comment">// Precalc table used to decompress shadow map</font>
00052 <font class="comment">// NB: if you want to change thoses values, see unpackLumelBlock, cause hardcoded.</font>
00053 <font class="keyword">static</font> <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a173">NL3DDecompressLumelFactor0Case0</a>[8]=
00054 {
00055 7, 0, 6, 5, 4, 3, 2, 1
00056 };
00057 <font class="keyword">static</font> <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a174">NL3DDecompressLumelFactor1Case0</a>[8]=
00058 {
00059 0, 7, 1, 2, 3, 4, 5, 6
00060 };
00061 <font class="keyword">static</font> <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a175">NL3DDecompressLumelFactor0Case1</a>[6]=
00062 {
00063 5, 0, 4, 3, 2, 1,
00064 };
00065 <font class="keyword">static</font> <font class="keyword">const</font> uint <a class="code" href="namespaceNL3D.html#a176">NL3DDecompressLumelFactor1Case1</a>[6]=
00066 {
00067 0, 5, 1, 2, 3, 4,
00068 };
00069 <font class="comment">// ***************************************************************************</font>
<a name="l00070"></a><a class="code" href="classNL3D_1_1CPatch.html#c2">00070</a> <font class="keywordtype">void</font> CPatch::unpackLumelBlock (uint8 *dest, <font class="keyword">const</font> uint8 *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>)
00071 {
00072 <font class="comment">// Take the two alpha values</font>
00073 uint alpha0=<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[0];
00074 uint alpha1=<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[1];
00075
00076 <font class="comment">// precompute the 8 possible values, for each possible code.</font>
00077 <font class="comment">// ------------------</font>
00078 uint8 values[8];
00079 <font class="comment">// Case 0</font>
00080 <font class="keywordflow">if</font> (alpha0>alpha1)
00081 {
00082 <font class="comment">// unrolled, and hardcoded for faster compute</font>
00083 values[0]= alpha0;
00084 values[1]= alpha1;
00085 values[2]= (uint8) ( (alpha0*219 + alpha1*37 ) >>8 ) ; <font class="comment">// 6*256/7</font>
00086 values[3]= (uint8) ( (alpha0*183 + alpha1*73 ) >>8 ) ; <font class="comment">// 5*256/7</font>
00087 values[4]= (uint8) ( (alpha0*146 + alpha1*110) >>8 ) ; <font class="comment">// 4*256/7</font>
00088 values[5]= (uint8) ( (alpha0*110 + alpha1*146) >>8 ) ; <font class="comment">// 3*256/7</font>
00089 values[6]= (uint8) ( (alpha0*73 + alpha1*183) >>8 ) ; <font class="comment">// 2*256/7</font>
00090 values[7]= (uint8) ( (alpha0*37 + alpha1*219) >>8 ) ; <font class="comment">// 1*256/7</font>
00091 }
00092 <font class="comment">// Case 1</font>
00093 <font class="keywordflow">else</font>
00094 {
00095 <font class="comment">// unrolled, and hardcoded for faster compute</font>
00096 values[0]= alpha0;
00097 values[1]= alpha1;
00098 values[2]= (uint8) ( (alpha0*205 + alpha1*51 ) >>8 ) ; <font class="comment">// 4*256/5</font>
00099 values[3]= (uint8) ( (alpha0*154 + alpha1*102) >>8 ) ; <font class="comment">// 3*256/5</font>
00100 values[4]= (uint8) ( (alpha0*102 + alpha1*154) >>8 ) ; <font class="comment">// 2*256/5</font>
00101 values[5]= (uint8) ( (alpha0*51 + alpha1*205) >>8 ) ; <font class="comment">// 1*256/5</font>
00102 values[6]= 0;
00103 values[7]= 255;
00104 }
00105
00106
00107 <font class="comment">// For each pixel, set the value according to the code</font>
00108 <font class="comment">// ------------------</font>
00109 uint block8Pixs[2];
00110 <font class="comment">// Split the 48 bits data in 2 24 bits pass.</font>
00111 block8Pixs[0]= ((uint)<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[2]<<16) + ((uint)<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[3]<<8) + ((uint)<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[4]) ;
00112 block8Pixs[1]= ((uint)<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[5]<<16) + ((uint)<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[6]<<8) + ((uint)<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[7]) ;
00113
00114 <font class="comment">// write all lumels</font>
00115 <font class="keywordflow">for</font>(uint i=0; i<2; i++)
00116 {
00117 uint blockPix= block8Pixs[i];
00118 <font class="comment">// parse the 8 pixs, and write seq to dest</font>
00119 <font class="keywordflow">for</font>(uint n=8; n>0; n--, dest++)
00120 {
00121 uint code= (blockPix>>21)&0x7;
00122
00123 <font class="comment">// read LUT, and store</font>
00124 *dest= values[code];
00125
00126 <font class="comment">// shift the block</font>
00127 blockPix<<= 3;
00128 }
00129 }
00130
00131 }
00132
00133 <font class="comment">// ***************************************************************************</font>
00134 <font class="keyword">inline</font> uint8 <a class="code" href="namespaceNL3D.html#a386">getUnpackLumelBlock</a> (<font class="keyword">const</font> uint8 *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint pixel)
00135 {
00136 <font class="comment">// Offset of the bit</font>
00137 pixel*=3;
00138 uint <a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>=(pixel>>3)+2;
00139 uint bits=pixel&7;
00140
00141 <font class="comment">// Uncompress 16 codes</font>
00142 uint code;
00143
00144 <font class="comment">// Get the code</font>
00145 <font class="keywordflow">if</font> (bits<=5)
00146 code=(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>]>>(5-bits))&0x7;
00147 <font class="keywordflow">else</font>
00148 code= ( (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>]<<(bits-5)) | (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[<a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a>+1]>>(13-bits)) )&0x7;
00149
00150 <font class="comment">// Case 0</font>
00151 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[0]><a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[1])
00152 {
00153 <font class="comment">// Decompress the data</font>
00154 <font class="keywordflow">return</font> (uint8)((<a class="code" href="namespaceNL3D.html#a173">NL3DDecompressLumelFactor0Case0</a>[code]*<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[0]+<a class="code" href="namespaceNL3D.html#a174">NL3DDecompressLumelFactor1Case0</a>[code]*<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[1])/7);
00155 }
00156 <font class="comment">// Case 1</font>
00157 <font class="keywordflow">else</font>
00158 {
00159 <font class="comment">// Decompress the data</font>
00160 <font class="keywordflow">if</font> (code<6)
00161 <font class="keywordflow">return</font> (uint8)((<a class="code" href="namespaceNL3D.html#a175">NL3DDecompressLumelFactor0Case1</a>[code]*<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[0]+<a class="code" href="namespaceNL3D.html#a176">NL3DDecompressLumelFactor1Case1</a>[code]*<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>[1])/5);
00162 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (code==6)
00163 <font class="keywordflow">return</font> 0;
00164 <font class="keywordflow">else</font>
00165 <font class="keywordflow">return</font> 255;
00166 }
00167 }
00168
00169 <font class="comment">// ***************************************************************************</font>
<a name="l00170"></a><a class="code" href="classNL3D_1_1CPatch.html#a34">00170</a> <font class="keywordtype">void</font> CPatch::unpackShadowMap (uint8 *pLumelDest)
00171 {
00172 <font class="comment">// Input of compresed data</font>
00173 uint8 *compressedData=&<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[0];
00174
00175 <font class="comment">// Number of lumel by lines</font>
00176 uint lumelCount=<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
00177
00178 <font class="comment">// Number of block in a line</font>
00179 <a class="code" href="debug_8h.html#a6">nlassert</a> ((lumelCount&0x3)==0);
00180 uint numLumelBlock=lumelCount>>2;
00181
00182 <font class="comment">// Number of line</font>
00183 uint lineCount=<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
00184
00185 <font class="comment">// Number of block line</font>
00186 <a class="code" href="debug_8h.html#a6">nlassert</a> ((lineCount&0x3)==0);
00187 uint numLineBlock=lineCount>>2;
00188
00189 <font class="comment">// Destination lumel block size</font>
00190 uint lumelDestBlockSize=4;
00191
00192 <font class="comment">// Destination lumel line block size</font>
00193 uint lumelDestLineBlockSize=lumelCount*lumelDestBlockSize;
00194
00195 <font class="comment">// Each line block</font>
00196 <font class="keywordflow">for</font> (uint lineBlock=0; lineBlock<numLineBlock; lineBlock++)
00197 {
00198 uint countVx4=16;
00199
00200 <font class="comment">// Block pointer</font>
00201 uint8 *blockLine=pLumelDest;
00202
00203 <font class="comment">// Each lumel block</font>
00204 <font class="keywordflow">for</font> (uint lumelBlock=0; lumelBlock<numLumelBlock; lumelBlock++)
00205 {
00206 <font class="comment">// *** Unpack the block</font>
00207 uint countU=4;
00208
00209 <font class="comment">// Destination lumel</font>
00210 uint8 *blockDest=blockLine;
00211
00212 <font class="comment">// Temp block</font>
00213 uint8 block[4*4];
00214
00215 <font class="comment">// Block unpacking...</font>
00216 <a class="code" href="classNL3D_1_1CPatch.html#c2">unpackLumelBlock</a> (block, compressedData);
00217
00218 <font class="comment">// Copy the lumels</font>
00219 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a><countVx4; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>+=4)
00220 {
00221 <font class="keywordflow">for</font> (uint u=0; u<countU; u++)
00222 {
00223 <font class="comment">// Copy the lumel</font>
00224 blockDest[u]=block[<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>+u];
00225 }
00226
00227 <font class="comment">// Next line</font>
00228 blockDest+=lumelCount;
00229 }
00230
00231 <font class="comment">// Next source block</font>
00232 compressedData+=<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>;
00233
00234 <font class="comment">// Next block on the line</font>
00235 blockLine+=lumelDestBlockSize;
00236 }
00237
00238 <font class="comment">// Next line of block</font>
00239 pLumelDest+=lumelDestLineBlockSize;
00240 }
00241 }
00242
00243 <font class="comment">// ***************************************************************************</font>
<a name="l00244"></a><a class="code" href="classNL3D_1_1CPatch.html#c1">00244</a> uint CPatch::evalLumelBlock (<font class="keyword">const</font> uint8 *original, <font class="keyword">const</font> uint8 *unCompressed, uint <a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>)
00245 {
00246 <font class="comment">// Sum</font>
00247 uint sum=0;
00248
00249 <font class="comment">// Eval error for each..</font>
00250 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a><<a class="code" href="driver__opengl__extension__def_8h.html#a390">height</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>++)
00251 <font class="keywordflow">for</font> (uint u=0; u<<a class="code" href="driver__opengl__extension__def_8h.html#a389">width</a>; u++)
00252 {
00253 sum += abs((sint)original[<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>*4+u]-(sint)unCompressed[<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>*4+u]);
00254 }
00255
00256 <font class="comment">// return the sum</font>
00257 <font class="keywordflow">return</font> sum;
00258 }
00259
00260 <font class="comment">// ***************************************************************************</font>
<a name="l00261"></a><a class="code" href="classNL3D_1_1CPatch.html#c0">00261</a> <font class="keywordtype">void</font> CPatch::packLumelBlock (uint8 *dest, <font class="keyword">const</font> uint8 *source, uint8 alpha0, uint8 alpha1)
00262 {
00263 <font class="comment">// Precalc the height values..</font>
00264 uint8 <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>[8];
00265
00266 <font class="comment">// For each value</font>
00267 uint i;
00268 <font class="keywordflow">for</font> (i=0; i<8; i++)
00269 {
00270 <font class="comment">// Case 0 or 1 ?</font>
00271 <font class="keywordflow">if</font> (alpha0>alpha1)
00272 <font class="comment">// Case 0</font>
00273 <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>[i]=(<a class="code" href="namespaceNL3D.html#a173">NL3DDecompressLumelFactor0Case0</a>[i]*alpha0+<a class="code" href="namespaceNL3D.html#a174">NL3DDecompressLumelFactor1Case0</a>[i]*alpha1)/7;
00274 <font class="keywordflow">else</font>
00275 {
00276 <font class="keywordflow">if</font> (i<6)
00277 <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>[i]=(<a class="code" href="namespaceNL3D.html#a175">NL3DDecompressLumelFactor0Case1</a>[i]*alpha0+<a class="code" href="namespaceNL3D.html#a176">NL3DDecompressLumelFactor1Case1</a>[i]*alpha1)/5;
00278 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (i==6)
00279 <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>[i]=0;
00280 <font class="keywordflow">else</font>
00281 <a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>[i]=255;
00282 }
00283 }
00284
00285 <font class="comment">// Store alpha value</font>
00286 dest[0]=alpha0;
00287 dest[1]=alpha1;
00288
00289 <font class="comment">// Clear dest codes</font>
00290 <font class="keywordflow">for</font> (i=0; i<6; i++)
00291 {
00292 <font class="comment">// Clear the code</font>
00293 dest[2+i]=0;
00294 }
00295
00296 <font class="comment">// For each original select the best</font>
00297 uint codeOffset=2;
00298 sint codeShift=5;
00299 <font class="keywordflow">for</font> (i=0; i<16; i++)
00300 {
00301 <font class="comment">// Best dist and code</font>
00302 uint bestDist=10000;
00303 uint8 bestCode=0;
00304
00305 <font class="comment">// Calc distance</font>
00306 <font class="keywordflow">for</font> (uint code=0; code<8; code++)
00307 {
00308 <font class="comment">// Distance from original value</font>
00309 uint dist=abs ((sint)(source[i])-(sint)(<a class="code" href="driver__opengl__extension__def_8h.html#a415">value</a>[code]));
00310
00311 <font class="comment">// The best ?</font>
00312 <font class="keywordflow">if</font> (dist<bestDist)
00313 {
00314 <font class="comment">// New best</font>
00315 bestDist=dist;
00316 bestCode=code;
00317 }
00318
00319 <font class="comment">// Perfect, stop searching</font>
00320 <font class="keywordflow">if</font> (dist==0)
00321 <font class="keywordflow">break</font>;
00322 }
00323
00324 <font class="comment">// Store the best</font>
00325 <font class="keywordflow">if</font> (codeShift>=0)
00326 dest[codeOffset]|=bestCode<<codeShift;
00327 <font class="keywordflow">else</font>
00328 {
00329 dest[codeOffset]|=bestCode>>(-codeShift);
00330 dest[codeOffset+1]|=bestCode<<(8+codeShift);
00331 }
00332
00333
00334 <font class="comment">// Next shift</font>
00335 codeShift-=3;
00336 <font class="keywordflow">if</font> (codeShift<=-3)
00337 {
00338 codeOffset++;
00339 codeShift+=8;
00340 }
00341 }
00342 }
00343
00344 <font class="comment">// ***************************************************************************</font>
<a name="l00345"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_17">00345</a> <font class="keywordtype">void</font> CPatch::getTileTileColors(uint ts, uint tt, CRGBA corners[4])
00346 {
00347 <font class="keywordflow">for</font>(sint i=0;i<4;i++)
00348 {
00349 CTileColor &tcol= <a class="code" href="classNL3D_1_1CPatch.html#m5">TileColors</a>[ (tt+(i>>1))*(<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>+1) + (ts+(i&1)) ];
00350 CRGBA &col= corners[i];
00351 col.set565 (tcol.Color565);
00352 }
00353 }
00354
00355
00356 <font class="comment">// ***************************************************************************</font>
00357 <font class="comment">// bilinear at center of the pixels. x E [0, 3], y E [0, 3].</font>
00358 <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a387">bilinearColor</a>(CRGBA corners[4], uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, uint &R, uint &G, uint &B)
00359 {
00360 <font class="comment">// Fast bilinear and modulate. </font>
00361 <font class="comment">// \todo yoyo: TODO_OPTIMIZE: should be ASMed later. (MMX...)</font>
00362 <font class="comment">// hardcoded for 4 pixels.</font>
00363 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>==4);
00364
00365 <font class="comment">// expand to be on center of pixel=> 1,3,5 or 7.</font>
00366 <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= (<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><<1)+1;
00367 <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= (<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<1)+1;
00368 uint x1= 8-<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>;
00369 uint y1= 8-<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00370
00371 <font class="comment">// compute weight factors.</font>
00372 uint xy= <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00373 uint x1y= x1*<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00374 uint xy1= <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>*y1;
00375 uint x1y1= x1*y1;
00376
00377 <font class="comment">// bilinear</font>
00378 <font class="comment">// pix left top.</font>
00379 R = corners[0].R * x1y1;
00380 G = corners[0].G * x1y1;
00381 B = corners[0].B * x1y1;
00382 <font class="comment">// pix right top.</font>
00383 R+= corners[1].R * xy1;
00384 G+= corners[1].G * xy1;
00385 B+= corners[1].B * xy1;
00386 <font class="comment">// pix left bottom.</font>
00387 R+= corners[2].R * x1y;
00388 G+= corners[2].G * x1y;
00389 B+= corners[2].B * x1y;
00390 <font class="comment">// pix right bottom.</font>
00391 R+= corners[3].R * xy;
00392 G+= corners[3].G * xy;
00393 B+= corners[3].B * xy;
00394
00395 }
00396
00397
00398 <font class="comment">// ***************************************************************************</font>
00399 <font class="comment">// bilinear at center of the pixels. x E [0, 3], y E [0, 3].</font>
00400 <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a388">bilinearColorAndModulate</a>(CRGBA corners[4], uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, CRGBA &<a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>)
00401 {
00402 uint R,G,B;
00403 <a class="code" href="namespaceNL3D.html#a387">bilinearColor</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, R, G, B);
00404
00405 <font class="comment">// modulate with input.</font>
00406 R*= <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.R;
00407 G*= <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.G;
00408 B*= <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.B;
00409
00410 <font class="comment">// result.</font>
00411 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.R= R >> 14;
00412 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.G= G >> 14;
00413 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.B= B >> 14;
00414 }
00415
00416
00417 <font class="comment">// ***************************************************************************</font>
00418 <font class="comment">// bilinear at center of the pixels. x E [0, 3], y E [0, 3].</font>
00419 <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a389">bilinearColorAndAdd</a>(CRGBA corners[4], uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, CRGBA &<a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>)
00420 {
00421 uint R,G,B;
00422 <a class="code" href="namespaceNL3D.html#a387">bilinearColor</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, R, G, B);
00423
00424 <font class="comment">// add with input.</font>
00425 R= (R>>6) + <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.R;
00426 G= (G>>6) + <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.G;
00427 B= (B>>6) + <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.B;
00428 R= <a class="code" href="bit__set_8cpp.html#a0">min</a>(R, 255U);
00429 G= <a class="code" href="bit__set_8cpp.html#a0">min</a>(G, 255U);
00430 B= <a class="code" href="bit__set_8cpp.html#a0">min</a>(B, 255U);
00431
00432 <font class="comment">// result.</font>
00433 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.R= R;
00434 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.G= G;
00435 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.B= B;
00436 }
00437
00438
00439
00440 <font class="comment">// ***************************************************************************</font>
<a name="l00441"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_14">00441</a> <font class="keywordtype">void</font> CPatch::modulateTileLightmapWithTileColors(uint ts, uint tt, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
00442 {
00443 <font class="comment">// Get the tileColors around this tile</font>
00444 CRGBA corners[4];
00445 <a class="code" href="classNL3D_1_1CPatch.html#z682_17">getTileTileColors</a>(ts, tt, corners);
00446
00447 <font class="comment">// For all lumel, bilinear.</font>
00448 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00449 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
00450 {
00451 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
00452 {
00453 <font class="comment">// compute this pixel, and modulate</font>
00454 <a class="code" href="namespaceNL3D.html#a388">bilinearColorAndModulate</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, dest[<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>]);
00455 }
00456 }
00457 }
00458
00459
00460 <font class="comment">// ***************************************************************************</font>
<a name="l00461"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_15">00461</a> <font class="keywordtype">void</font> CPatch::modulateTileLightmapEdgeWithTileColors(uint ts, uint tt, uint edge, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keywordtype">bool</font> inverse)
00462 {
00463 <font class="comment">// Get the tileColors around this tile</font>
00464 CRGBA corners[4];
00465 <a class="code" href="classNL3D_1_1CPatch.html#z682_17">getTileTileColors</a>(ts, tt, corners);
00466
00467 <font class="comment">// get coordinate according to edge.</font>
00468 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0,<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;
00469 <font class="keywordflow">switch</font>(edge)
00470 {
00471 <font class="keywordflow">case</font> 0: <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= 0; <font class="keywordflow">break</font>;
00472 <font class="keywordflow">case</font> 1: <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1; <font class="keywordflow">break</font>;
00473 <font class="keywordflow">case</font> 2: <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1; <font class="keywordflow">break</font>;
00474 <font class="keywordflow">case</font> 3: <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= 0; <font class="keywordflow">break</font>;
00475 };
00476
00477 <font class="comment">// For all lumel of the edge, bilinear.</font>
00478 uint i;
00479 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; i++)
00480 {
00481 <font class="comment">// if vertical edge</font>
00482 <font class="keywordflow">if</font>( (edge&1)==0 ) <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= i;
00483 <font class="comment">// else horizontal edge</font>
00484 <font class="keywordflow">else</font> <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= i;
00485
00486 <font class="comment">// manage inverse.</font>
00487 uint where;
00488 <font class="keywordflow">if</font>(inverse) where= (<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1)-i;
00489 <font class="keywordflow">else</font> where= i;
00490 <font class="comment">// compute this pixel, and modulate</font>
00491 <a class="code" href="namespaceNL3D.html#a388">bilinearColorAndModulate</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, dest[where*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>]);
00492 }
00493 }
00494
00495
00496 <font class="comment">// ***************************************************************************</font>
<a name="l00497"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_16">00497</a> <font class="keywordtype">void</font> CPatch::modulateTileLightmapPixelWithTileColors(uint ts, uint tt, uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, CRGBA *dest)
00498 {
00499 <font class="comment">// Get the tileColors around this tile</font>
00500 CRGBA corners[4];
00501 <a class="code" href="classNL3D_1_1CPatch.html#z682_17">getTileTileColors</a>(ts, tt, corners);
00502
00503 <font class="comment">// compute this pixel, and modulate</font>
00504 <a class="code" href="namespaceNL3D.html#a388">bilinearColorAndModulate</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, *dest);
00505 }
00506
00507
00508
00509 <font class="comment">// ***************************************************************************</font>
<a name="l00510"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_8">00510</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapAutomatic(uint ts, uint tt, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
00511 {
00512 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00513 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
00514 {
00515 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
00516 {
00517 <font class="comment">// compute this pixel.</font>
00518 <a class="code" href="classNL3D_1_1CPatch.html#z682_10">computeTileLightmapPixelAutomatic</a>(ts, tt, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, dest+ <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>);
00519 }
00520 }
00521 }
00522
00523 <font class="comment">// ***************************************************************************</font>
<a name="l00524"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_9">00524</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapEdgeAutomatic(uint ts, uint tt, uint edge, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keywordtype">bool</font> inverse)
00525 {
00526 <font class="comment">// get coordinate according to edge.</font>
00527 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0,<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;
00528 <font class="keywordflow">switch</font>(edge)
00529 {
00530 <font class="keywordflow">case</font> 0: <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= 0; <font class="keywordflow">break</font>;
00531 <font class="keywordflow">case</font> 1: <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1; <font class="keywordflow">break</font>;
00532 <font class="keywordflow">case</font> 2: <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1; <font class="keywordflow">break</font>;
00533 <font class="keywordflow">case</font> 3: <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= 0; <font class="keywordflow">break</font>;
00534 };
00535
00536 uint i;
00537 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; i++)
00538 {
00539 <font class="comment">// if vertical edge</font>
00540 <font class="keywordflow">if</font>( (edge&1)==0 ) <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= i;
00541 <font class="comment">// else horizontal edge</font>
00542 <font class="keywordflow">else</font> <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= i;
00543
00544 <font class="comment">// manage inverse.</font>
00545 uint where;
00546 <font class="keywordflow">if</font>(inverse) where= (<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1)-i;
00547 <font class="keywordflow">else</font> where= i;
00548 <font class="comment">// compute this pixel.</font>
00549 <a class="code" href="classNL3D_1_1CPatch.html#z682_10">computeTileLightmapPixelAutomatic</a>(ts, tt, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, dest+ where*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>);
00550 }
00551 }
00552
00553 <font class="comment">// ***************************************************************************</font>
<a name="l00554"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_10">00554</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapPixelAutomatic(uint ts, uint tt, uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, CRGBA *dest)
00555 {
00556 <font class="keywordtype">float</font> u,<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
00557 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">float</font> lumelSize= 1.f/<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
00558
00559 <font class="comment">// use 3 computeVertex to compute a normal. This is slow....</font>
00560 CVector p0, p1 ,p2;
00561 <font class="comment">// 1st vert. Top-left of the lumel.</font>
00562 u= (ts + <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>*lumelSize )/<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>;
00563 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (tt + <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>*lumelSize )/<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>;
00564 p0= <a class="code" href="classNL3D_1_1CPatch.html#a16">computeVertex</a>(u, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>);
00565 <font class="comment">// 2nd vert. Bottom-left of the lumel.</font>
00566 u= (ts + <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>*lumelSize )/<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>;
00567 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (tt + (<a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>+1)*lumelSize )/<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>;
00568 p1= <a class="code" href="classNL3D_1_1CPatch.html#a16">computeVertex</a>(u, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>);
00569 <font class="comment">// 3rd vert. Center-Right of the lumel.</font>
00570 u= (ts + (<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>+1)*lumelSize )/<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>;
00571 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (tt + (<a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>+0.5f)*lumelSize )/<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>;
00572 p2= <a class="code" href="classNL3D_1_1CPatch.html#a16">computeVertex</a>(u, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>);
00573
00574 <font class="comment">// the normal.</font>
00575 CVector normal;
00576 normal= (p1-p0)^(p2-p0);
00577 normal.normalize();
00578
00579 <font class="comment">// lighting.</font>
00580 <font class="keywordtype">float</font> c= -normal*<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getAutomaticLightDir();
00581 c= max(c, 0.f);
00582 sint ic;
00583
00584 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font>
00585 <font class="preprocessor"></font> <font class="comment">// FastFloor using fistp. Don't care convention.</font>
00586 <font class="keywordtype">float</font> fc= c*256;
00587 _asm
00588 {
00589 fld fc
00590 fistp ic
00591 }
00592 <font class="preprocessor">#else</font>
00593 <font class="preprocessor"></font> ic= (sint)floor(c*256);
00594 <font class="preprocessor">#endif</font>
00595 <font class="preprocessor"></font> <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(ic, 0, 255);
00596
00597 <font class="comment">// ambiant/diffuse lighting.</font>
00598 *dest= <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getStaticLight()[ic];
00599 }
00600
00601
00602 <font class="comment">// ***************************************************************************</font>
<a name="l00603"></a><a class="code" href="classNL3D_1_1CPatch.html#z686_3">00603</a> <font class="keywordtype">void</font> CPatch::getTileLumelmapPrecomputed(uint ts, uint tt, uint8 *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
00604 {
00605 <font class="comment">// Unpack the lumels</font>
00606 uint8 buffer[<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>];
00607 <a class="code" href="classNL3D_1_1CPatch.html#c2">unpackLumelBlock</a> (buffer, &(<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[(ts + (tt*<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>))*<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>]));
00608
00609 <font class="comment">// Retrun it</font>
00610 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00611 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
00612 {
00613 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
00614 {
00615 <font class="comment">// lumel</font>
00616 dest[<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>]= buffer[<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<<a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>)];
00617 }
00618 }
00619 }
00620
00621
00622 <font class="comment">// ***************************************************************************</font>
<a name="l00623"></a><a class="code" href="classNL3D_1_1CPatch.html#z686_4">00623</a> <font class="keywordtype">void</font> CPatch::getTileLumelmapPixelPrecomputed(uint ts, uint tt, uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, uint8 &dest)<font class="keyword"> const</font>
00624 <font class="keyword"></font>{
00625 <font class="comment">// Return the lumel</font>
00626 dest= <a class="code" href="namespaceNL3D.html#a386">getUnpackLumelBlock</a> (&(<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[(ts + (tt*<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>))*<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>]), <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>+(<a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a><<2));
00627 }
00628
00629
00630 <font class="comment">// ***************************************************************************</font>
<a name="l00631"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_11">00631</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapPrecomputed(uint ts, uint tt, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
00632 {
00633 <font class="comment">// Lumel table</font>
00634 <font class="keyword">const</font> CRGBA* colorTable=<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a> ()->getStaticLight ();
00635 <font class="comment">// Unpack the lumels</font>
00636 uint8 buffer[<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>];
00637 <a class="code" href="classNL3D_1_1CPatch.html#c2">unpackLumelBlock</a> (buffer, &(<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[(ts + (tt*<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>))*<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>]));
00638
00639 <font class="comment">// Retrun it</font>
00640 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
00641 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
00642 {
00643 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
00644 {
00645 <font class="comment">// lumel</font>
00646 dest[<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>]=colorTable[buffer[<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<<a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>)]];
00647 }
00648 }
00649 }
00650
00651 <font class="comment">// ***************************************************************************</font>
00652
00653 <font class="keyword">static</font> uint <a class="code" href="namespaceNL3D.html#a177">NL3DPixelStartLumel</a>[4]={0, 4*3, 3, 0};
00654 <font class="keyword">static</font> uint <a class="code" href="namespaceNL3D.html#a178">NL3DDeltaLumel</a>[4]={4, 1, 4, 1};
00655
00656 <font class="comment">// ***************************************************************************</font>
<a name="l00657"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_12">00657</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapEdgePrecomputed(uint ts, uint tt, uint edge, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keywordtype">bool</font> inverse)
00658 {
00659 <font class="comment">// Lumel table</font>
00660 <font class="keyword">const</font> CRGBA* colorTable=<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a> ()->getStaticLight ();
00661
00662 <font class="comment">// Witch corner to start ?</font>
00663 uint pixel=<a class="code" href="namespaceNL3D.html#a177">NL3DPixelStartLumel</a>[edge];
00664 uint delta=<a class="code" href="namespaceNL3D.html#a178">NL3DDeltaLumel</a>[edge];
00665
00666 <font class="comment">// For each lumels</font>
00667 <font class="keyword">const</font> uint8 *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>=&(<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[(ts + (tt*<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>))*<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>]);
00668 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>;
00669 <font class="keywordflow">if</font> (inverse)
00670 {
00671 uint inverseStride=<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>*(4-1);
00672 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><4; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
00673 {
00674 <font class="comment">// lumel</font>
00675 dest[inverseStride-<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>]=colorTable[<a class="code" href="namespaceNL3D.html#a386">getUnpackLumelBlock</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, pixel)];
00676 pixel+=delta;
00677 }
00678 }
00679 <font class="keywordflow">else</font>
00680 {
00681 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><4; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
00682 {
00683 <font class="comment">// lumel</font>
00684 dest[<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>]=colorTable[<a class="code" href="namespaceNL3D.html#a386">getUnpackLumelBlock</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, pixel)];
00685 pixel+=delta;
00686 }
00687 }
00688 }
00689
00690 <font class="comment">// ***************************************************************************</font>
<a name="l00691"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_13">00691</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapPixelPrecomputed(uint ts, uint tt, uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, CRGBA *dest)
00692 {
00693 <font class="comment">// Lumel table</font>
00694 <font class="keyword">const</font> CRGBA* colorTable=<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a> ()->getStaticLight ();
00695
00696 <font class="comment">// Return the lumel</font>
00697 *dest=colorTable[<a class="code" href="namespaceNL3D.html#a386">getUnpackLumelBlock</a> (&(<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[(ts + (tt*<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>))*<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>]), <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>+(<a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a><<2))];
00698 }
00699
00700
00701
00702 <font class="comment">// ***************************************************************************</font>
<a name="l00703"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_5">00703</a> <font class="keywordtype">void</font> CPatch::computeTileLightmap(uint ts, uint tt, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
00704 {
00705 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getAutomaticLighting())
00706 <a class="code" href="classNL3D_1_1CPatch.html#z682_8">computeTileLightmapAutomatic</a>(ts, tt, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>);
00707 <font class="keywordflow">else</font>
00708 {
00709 <a class="code" href="classNL3D_1_1CPatch.html#z682_11">computeTileLightmapPrecomputed</a>(ts, tt, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>);
00710 <font class="comment">// Add the inlufence of TLI.</font>
00711 <a class="code" href="classNL3D_1_1CPatch.html#z682_20">addTileLightmapWithTLI</a>(ts, tt, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>);
00712 }
00713
00714 <font class="comment">// modulate dest with tileColors (at center of lumels).</font>
00715 <a class="code" href="classNL3D_1_1CPatch.html#z682_14">modulateTileLightmapWithTileColors</a>(ts, tt, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>);
00716 }
00717 <font class="comment">// ***************************************************************************</font>
<a name="l00718"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_6">00718</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapEdge(uint ts, uint tt, uint edge, CRGBA *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keywordtype">bool</font> inverse)
00719 {
00720 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getAutomaticLighting())
00721 <a class="code" href="classNL3D_1_1CPatch.html#z682_9">computeTileLightmapEdgeAutomatic</a>(ts, tt, edge, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, inverse);
00722 <font class="keywordflow">else</font>
00723 {
00724 <a class="code" href="classNL3D_1_1CPatch.html#z682_12">computeTileLightmapEdgePrecomputed</a>(ts, tt, edge, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, inverse);
00725 <font class="comment">// Add the inlufence of TLI.</font>
00726 <a class="code" href="classNL3D_1_1CPatch.html#z682_21">addTileLightmapEdgeWithTLI</a>(ts, tt, edge, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, inverse);
00727 }
00728
00729 <font class="comment">// modulate dest with tileColors (at center of lumels).</font>
00730 <a class="code" href="classNL3D_1_1CPatch.html#z682_15">modulateTileLightmapEdgeWithTileColors</a>(ts, tt, edge, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, inverse);
00731 }
00732
00733
00734 <font class="comment">// ***************************************************************************</font>
<a name="l00735"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_7">00735</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapPixel(uint ts, uint tt, uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, CRGBA *dest)
00736 {
00737 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getAutomaticLighting())
00738 <a class="code" href="classNL3D_1_1CPatch.html#z682_10">computeTileLightmapPixelAutomatic</a>(ts, tt, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, dest);
00739 <font class="keywordflow">else</font>
00740 {
00741 <a class="code" href="classNL3D_1_1CPatch.html#z682_13">computeTileLightmapPixelPrecomputed</a>(ts, tt, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, dest);
00742 <font class="comment">// Add the inlufence of TLI.</font>
00743 <a class="code" href="classNL3D_1_1CPatch.html#z682_22">addTileLightmapPixelWithTLI</a>(ts, tt, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, dest);
00744 }
00745
00746 <font class="comment">// modulate dest with tileColors (at center of lumels).</font>
00747 <a class="code" href="classNL3D_1_1CPatch.html#z682_16">modulateTileLightmapPixelWithTileColors</a>(ts, tt, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, dest);
00748 }
00749
00750
00751 <font class="comment">// ***************************************************************************</font>
<a name="l00752"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_4">00752</a> <font class="keywordtype">void</font> CPatch::computeTileLightmapPixelAroundCorner(<font class="keyword">const</font> CVector2f &stIn, CRGBA *dest, <font class="keywordtype">bool</font> lookAround)
00753 {
00754 <font class="keywordtype">bool</font> mustLookOnNeighbor= <font class="keyword">false</font>;
00755
00756 <font class="comment">// Get the Uv, in [0,Order?*NL_LUMEL_BY_TILE] basis (ie lumel basis).</font>
00757 sint u, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
00758 u= (sint)floor(stIn.x*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
00759 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (sint)floor(stIn.y*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
00760
00761 <font class="comment">// if allowed, try to go on neighbor patch.</font>
00762 <font class="keywordflow">if</font>(lookAround)
00763 {
00764 <font class="comment">// try to know if we must go on a neighbor patch (maybe false with bind X/1).</font>
00765 <font class="keywordflow">if</font>( u<0 || u>=<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a> || v<0 || v>=<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>)
00766 mustLookOnNeighbor= <font class="keyword">true</font>;
00767 }
00768
00769
00770 <font class="comment">// If we must get (if possible) the pixel in the current patch, do it.</font>
00771 <font class="keywordflow">if</font>(!mustLookOnNeighbor)
00772 {
00773 <font class="comment">// if out this patch, abort.</font>
00774 <font class="keywordflow">if</font>( u<0 || u>=<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a> || v<0 || v>=<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>)
00775 <font class="keywordflow">return</font>;
00776 <font class="keywordflow">else</font>
00777 {
00778 <font class="comment">// get this pixel.</font>
00779 <a class="code" href="classNL3D_1_1CPatch.html#z682_7">computeTileLightmapPixel</a>(u>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, u&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), dest);
00780 }
00781 }
00782 <font class="comment">// else get from the best neighbor patch.</font>
00783 <font class="keywordflow">else</font>
00784 {
00785 <font class="comment">// choose against which edge we must find the pixel.</font>
00786 uint edge=0;
00787 <font class="keywordflow">if</font>(u<0) edge=0;
00788 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>>=<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>) edge=1;
00789 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(u>=<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>) edge=2;
00790 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a><0) edge=3;
00791
00792 <font class="comment">// retrieve info on neighbor.</font>
00793 CBindInfo bindInfo;
00794 <a class="code" href="classNL3D_1_1CPatch.html#a13">getBindNeighbor</a>(edge, bindInfo);
00795
00796 <font class="comment">// if neighbor present.</font>
00797 <font class="keywordflow">if</font>(bindInfo.Zone)
00798 {
00799 CVector2f stOut;
00800 <a class="code" href="classNL3D_1_1CPatch.html#a0">CPatch</a> *patchOut;
00801 uint patchId;
00802
00803 <font class="comment">// Ok, search uv on this patch.</font>
00804 CPatchUVLocator uvLocator;
00805 uvLocator.build(<font class="keyword">this</font>, edge, bindInfo);
00806 patchId= uvLocator.selectPatch(stIn);
00807 uvLocator.locateUV(stIn, patchId, patchOut, stOut);
00808
00809 <font class="comment">// retry only one time, so at next call, must find the data IN htis patch (else abort).</font>
00810 patchOut->computeTileLightmapPixelAroundCorner(stOut, dest, <font class="keyword">false</font>);
00811 }
00812 }
00813 }
00814
00815
00816 <font class="comment">// ***************************************************************************</font>
<a name="l00817"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_3">00817</a> <font class="keywordtype">void</font> CPatch::computeNearBlockLightmap(uint uts, uint utt, CRGBA *lightText)
00818 {
00819 sint ts= uts;
00820 sint tt= utt;
00821
00822 <font class="comment">// hardcoded for 10x10.</font>
00823 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>==10);
00824 CRGBA *dest;
00825 uint edge;
00826 uint corner;
00827
00828 <font class="comment">// Compute center of the TessBlock: the 2x2 tiles.</font>
00829 <font class="comment">//=================</font>
00830 <font class="comment">// compute tile 0,0 of the tessBlock. must decal of 1 pixel.</font>
00831 dest= lightText+<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>+1;
00832 <a class="code" href="classNL3D_1_1CPatch.html#z682_5">computeTileLightmap</a>(ts, tt, dest, <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>);
00833 <font class="comment">// compute tile 1,0 of the tessBlock. must decal of 1 pixel.</font>
00834 dest= lightText + <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a> + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>+1 ;
00835 <a class="code" href="classNL3D_1_1CPatch.html#z682_5">computeTileLightmap</a>(ts+1, tt, dest, <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>);
00836 <font class="comment">// compute tile 0,1 of the tessBlock. must decal of 1 pixel.</font>
00837 dest= lightText + <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a> + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>+1 ;
00838 <a class="code" href="classNL3D_1_1CPatch.html#z682_5">computeTileLightmap</a>(ts, tt+1, dest, <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>);
00839 <font class="comment">// compute tile 1,1 of the tessBlock. must decal of 1 pixel.</font>
00840 dest= lightText + <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a> + <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a> + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>+1 ;
00841 <a class="code" href="classNL3D_1_1CPatch.html#z682_5">computeTileLightmap</a>(ts+1, tt+1, dest, <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>);
00842
00843
00844 <font class="comment">// Compute edges of the TessBlock.</font>
00845 <font class="comment">//=================</font>
00846 <font class="keywordtype">bool</font> edgeBorder[4];
00847 <font class="comment">// where are we on a border of a patch??</font>
00848 edgeBorder[0]= ( ts==0 );
00849 edgeBorder[1]= ( tt == <a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>-2 );
00850 edgeBorder[2]= ( ts == <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>-2 );
00851 edgeBorder[3]= ( tt==0 );
00852
00853 <font class="comment">// For all edges.</font>
00854 <font class="keywordflow">for</font>(edge=0; edge<4; edge++)
00855 {
00856 <font class="comment">// compute dest info.</font>
00857 <font class="comment">//==============</font>
00858 <font class="comment">// Are we on a vertical edge or horizontal edge??</font>
00859 uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>= (edge&1)==0? <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a> : 1;
00860
00861 <font class="comment">// must compute on which tile we must find info.</font>
00862 sint decalS=0;
00863 sint decalT=0;
00864 <font class="comment">// and must compute ptr, where we store the result of the edge.</font>
00865 <font class="keywordflow">switch</font>(edge)
00866 {
00867 <font class="keywordflow">case</font> 0: decalS=-1; dest= lightText + 0 + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
00868 <font class="keywordflow">case</font> 1: decalT= 2; dest= lightText + 1 + (<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>-1)*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
00869 <font class="keywordflow">case</font> 2: decalS= 2; dest= lightText + (<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>-1) + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
00870 <font class="keywordflow">case</font> 3: decalT=-1; dest= lightText + 1; <font class="keywordflow">break</font>;
00871 };
00872
00873 <font class="comment">// compute the second tile dest info.</font>
00874 CRGBA *dest2;
00875 sint decalS2;
00876 sint decalT2;
00877 <font class="comment">// if vertical edge.</font>
00878 <font class="keywordflow">if</font>((edge&1)==0)
00879 {
00880 <font class="comment">// Next Y tile.</font>
00881 dest2= dest + <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>;
00882 decalS2= decalS;
00883 decalT2= decalT+1;
00884 }
00885 <font class="keywordflow">else</font>
00886 {
00887 <font class="comment">// Next X tile.</font>
00888 dest2= dest + <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
00889 decalS2= decalS+1;
00890 decalT2= decalT;
00891 }
00892
00893
00894 <font class="comment">// If we are not on a border of a patch, just compute on the interior of the patch.</font>
00895 <font class="comment">//==============</font>
00896 <font class="keywordflow">if</font>(!edgeBorder[edge])
00897 {
00898 <font class="comment">// find the result on the mirrored border of us. First tile.</font>
00899 <a class="code" href="classNL3D_1_1CPatch.html#z682_6">computeTileLightmapEdge</a>(ts+decalS, tt+decalT, (edge+2)&3, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keyword">false</font>);
00900
00901 <font class="comment">// find the result on the mirrored border of us. Second Tile.</font>
00902 <a class="code" href="classNL3D_1_1CPatch.html#z682_6">computeTileLightmapEdge</a>(ts+decalS2, tt+decalT2, (edge+2)&3, dest2, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keyword">false</font>);
00903
00904 }
00905 <font class="comment">// else, slightly complicated, must find the result on neighbor patch(s).</font>
00906 <font class="comment">//==============</font>
00907 <font class="keywordflow">else</font>
00908 {
00909 CPatchUVLocator uvLocator;
00910 CBindInfo bindInfo;
00911 bindInfo.Zone= NULL;
00912
00913 <font class="comment">// if smmothed edge, search the neighbor.</font>
00914 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#a40">getSmoothFlag</a>(edge))
00915 {
00916 <font class="comment">// Build the bindInfo against this edge.</font>
00917 <a class="code" href="classNL3D_1_1CPatch.html#a13">getBindNeighbor</a>(edge, bindInfo);
00918
00919 <font class="comment">// if ok, build the uv info against this edge.</font>
00920 <font class="keywordflow">if</font>(bindInfo.Zone)
00921 {
00922 uvLocator.build(<font class="keyword">this</font>, edge, bindInfo);
00923 <font class="comment">// if there is not same tile order across the edge, invalidate the smooth.</font>
00924 <font class="comment">// This is rare, so don't bother.</font>
00925 <font class="keywordflow">if</font>(!uvLocator.sameEdgeOrder())
00926 bindInfo.Zone= NULL;
00927 }
00928 }
00929
00930
00931 <font class="comment">// Fast reject: if no neighbor, or if not smoothed, or if edge order pb, just copy from my interior.</font>
00932 <font class="keywordflow">if</font>(!bindInfo.Zone)
00933 {
00934 CRGBA *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>=0;
00935 <font class="keywordflow">switch</font>(edge)
00936 {
00937 <font class="keywordflow">case</font> 0: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest + 1; <font class="keywordflow">break</font>;
00938 <font class="keywordflow">case</font> 1: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest - <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
00939 <font class="keywordflow">case</font> 2: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest - 1; <font class="keywordflow">break</font>;
00940 <font class="keywordflow">case</font> 3: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
00941 };
00942
00943 <font class="comment">// fill the NL_LUMEL_BY_TILE*2 (8) pixels.</font>
00944 <font class="keywordflow">for</font>(uint n=<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>*2; n>0; n--, <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>+=<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, dest+=<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
00945 *dest= *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>;
00946 }
00947 <font class="comment">// else, ok, get from neighbor.</font>
00948 <font class="keywordflow">else</font>
00949 {
00950 CVector2f stIn, stOut;
00951 <a class="code" href="classNL3D_1_1CPatch.html#a0">CPatch</a> *patchOut;
00952 uint patchId;
00953 uint edgeOut;
00954 <font class="keywordtype">bool</font> inverse;
00955
00956 <font class="comment">// First Tile.</font>
00957 <font class="comment">//=========</font>
00958 <font class="comment">// to remove floor pbs, take the center of the wanted tile.</font>
00959 stIn.set(ts+decalS + 0.5f, tt+decalT + 0.5f);
00960 patchId= uvLocator.selectPatch(stIn);
00961 uvLocator.locateUV(stIn, patchId, patchOut, stOut);
00962 <font class="comment">// must find what edge on neighbor to compute, and if we must inverse (swap) result.</font>
00963 <font class="comment">// easy: the edge of the tile is the edge of the patch where we are binded.</font>
00964 edgeOut= bindInfo.Edge[patchId];
00965 <font class="comment">// edge0 is oriented in T increasing order. edge1 is oriented in S increasing order.</font>
00966 <font class="comment">// edge2 is oriented in T decreasing order. edge3 is oriented in S decreasing order.</font>
00967 <font class="comment">// inverse is true if same sens on both edges (because of mirroring, sens should be different).</font>
00968 inverse= (edge>>1)==(edgeOut>>1);
00969 <font class="comment">// compute the lightmap on the edge of the neighbor.</font>
00970 patchOut->computeTileLightmapEdge((sint)floor(stOut.x), (sint)floor(stOut.y), edgeOut, dest, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, inverse);
00971
00972 <font class="comment">// Second Tile.</font>
00973 <font class="comment">//=========</font>
00974 <font class="comment">// same reasoning.</font>
00975 stIn.set(ts+decalS2 + 0.5f, tt+decalT2 + 0.5f);
00976 patchId= uvLocator.selectPatch(stIn);
00977 uvLocator.locateUV(stIn, patchId, patchOut, stOut);
00978 edgeOut= bindInfo.Edge[patchId];
00979 inverse= (edge>>1)==(edgeOut>>1);
00980 patchOut->computeTileLightmapEdge((sint)floor(stOut.x), (sint)floor(stOut.y), edgeOut, dest2, <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, inverse);
00981 }
00982
00983 }
00984 }
00985
00986
00987 <font class="comment">// Compute corners of the TessBlock.</font>
00988 <font class="comment">//=================</font>
00989 <font class="keywordtype">bool</font> cornerOnPatchEdge[4];
00990 <font class="keywordtype">bool</font> cornerOnPatchCorner[4];
00991 <font class="comment">// where are we on a edge border of a patch??</font>
00992 cornerOnPatchEdge[0]= edgeBorder[3] != edgeBorder[0];
00993 cornerOnPatchEdge[1]= edgeBorder[0] != edgeBorder[1];
00994 cornerOnPatchEdge[2]= edgeBorder[1] != edgeBorder[2];
00995 cornerOnPatchEdge[3]= edgeBorder[2] != edgeBorder[3];
00996 <font class="comment">// where are we on a corner border of a patch??</font>
00997 cornerOnPatchCorner[0]= edgeBorder[3] && edgeBorder[0];
00998 cornerOnPatchCorner[1]= edgeBorder[0] && edgeBorder[1];
00999 cornerOnPatchCorner[2]= edgeBorder[1] && edgeBorder[2];
01000 cornerOnPatchCorner[3]= edgeBorder[2] && edgeBorder[3];
01001
01002 <font class="comment">// For all corners.</font>
01003 <font class="keywordflow">for</font>(corner=0; corner<4; corner++)
01004 {
01005 <font class="comment">// compute dest info.</font>
01006 <font class="comment">//==============</font>
01007 <font class="comment">// must compute on which tile we must find info.</font>
01008 sint decalS=0;
01009 sint decalT=0;
01010 <font class="comment">// and must compute ptr, where we store the result of the corner.</font>
01011 <font class="keywordflow">switch</font>(corner)
01012 {
01013 <font class="keywordflow">case</font> 0: decalS=-1; decalT=-1; dest= lightText + 0 + 0; <font class="keywordflow">break</font>;
01014 <font class="keywordflow">case</font> 1: decalS=-1; decalT= 2; dest= lightText + 0 + (<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>-1)*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
01015 <font class="keywordflow">case</font> 2: decalS= 2; decalT= 2; dest= lightText + (<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>-1) + (<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>-1)*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
01016 <font class="keywordflow">case</font> 3: decalS= 2; decalT=-1; dest= lightText + (<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>-1) + 0; <font class="keywordflow">break</font>;
01017 };
01018
01019
01020 <font class="comment">// If we are not on a border of a patch, just compute on the interior of the patch.</font>
01021 <font class="comment">//==============</font>
01022 <font class="comment">// if the corner is IN the patch.</font>
01023 <font class="keywordflow">if</font>(!cornerOnPatchCorner[corner] && !cornerOnPatchEdge[corner])
01024 {
01025 <font class="comment">// what pixel to read.</font>
01026 uint subS, subT;
01027 <font class="keywordflow">if</font>(decalS==-1) subS= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1;
01028 <font class="keywordflow">else</font> subS= 0;
01029 <font class="keywordflow">if</font>(decalT==-1) subT= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1;
01030 <font class="keywordflow">else</font> subT= 0;
01031
01032 <font class="comment">// find the result on the corner of the neighbor tile.</font>
01033 <a class="code" href="classNL3D_1_1CPatch.html#z682_7">computeTileLightmapPixel</a>(ts+decalS, tt+decalT, subS, subT, dest);
01034 }
01035 <font class="keywordflow">else</font>
01036 {
01037 <font class="comment">// By default, fill the corner with our interior corner. Because other methods may fail.</font>
01038 CRGBA *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>=0;
01039 <font class="keywordflow">switch</font>(corner)
01040 {
01041 <font class="keywordflow">case</font> 0: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest + 1 + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
01042 <font class="keywordflow">case</font> 1: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest + 1 - <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
01043 <font class="keywordflow">case</font> 2: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest - 1 - <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
01044 <font class="keywordflow">case</font> 3: <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>= dest - 1 + <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>; <font class="keywordflow">break</font>;
01045 };
01046
01047 <font class="comment">// fill the pixel.</font>
01048 *dest= *<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>;
01049
01050 <font class="comment">// get the coordinate of the corner, in our [0,Order] basis. get it at the center of the pixel.</font>
01051 CBindInfo bindInfo;
01052 CPatchUVLocator uvLocator;
01053 CVector2f stIn, stOut;
01054 <a class="code" href="classNL3D_1_1CPatch.html#a0">CPatch</a> *patchOut;
01055 uint patchId;
01056 <font class="keywordtype">float</font> decX, decY;
01057 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">float</font> lumelSize= 1.f/<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
01058 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">float</font> semiLumelSize= 0.5f*lumelSize;
01059
01060 <font class="keywordflow">if</font>(decalS==-1) decX= - semiLumelSize;
01061 <font class="keywordflow">else</font> decX= 2+ semiLumelSize;
01062 <font class="keywordflow">if</font>(decalT==-1) decY= - semiLumelSize;
01063 <font class="keywordflow">else</font> decY= 2+ semiLumelSize;
01064 stIn.set( ts+decX, tt+decY);
01065
01066
01067 <font class="comment">// if the corner is on One edge only of the patch.</font>
01068 <font class="keywordflow">if</font>(cornerOnPatchEdge[corner])
01069 {
01070 <font class="comment">// find the edge where to read this corner: hard edge after or before this corner.</font>
01071 <font class="keywordflow">if</font>(edgeBorder[corner]) edge= corner;
01072 <font class="keywordflow">else</font> edge= (corner+4-1) & 3;
01073
01074 <font class="comment">// if this edge is smoothed, find on neighbor.</font>
01075 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#a40">getSmoothFlag</a>(edge))
01076 {
01077 <font class="comment">// retrieve neigbhor info.</font>
01078 <a class="code" href="classNL3D_1_1CPatch.html#a13">getBindNeighbor</a>(edge, bindInfo);
01079
01080 <font class="comment">// if neighbor present.</font>
01081 <font class="keywordflow">if</font>(bindInfo.Zone)
01082 {
01083 <font class="comment">// Ok, search uv on this patch.</font>
01084 uvLocator.build(<font class="keyword">this</font>, edge, bindInfo);
01085 patchId= uvLocator.selectPatch(stIn);
01086 uvLocator.locateUV(stIn, patchId, patchOut, stOut);
01087
01088 <font class="comment">// Get the Uv, in [0,Order?*NL_LUMEL_BY_TILE] basis (ie lumel basis), and get from neighbor patch</font>
01089 sint u, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
01090 u= (sint)floor(stOut.x*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
01091 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (sint)floor(stOut.y*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
01092 patchOut->computeTileLightmapPixel(u>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, u&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), dest);
01093 }
01094 }
01095 <font class="comment">// else we must still smooth with our lumel on this patch, so get it from neighbor on edge.</font>
01096 <font class="keywordflow">else</font>
01097 {
01098 <font class="comment">// first, clamp to our patch (recenter on the previous pixel)</font>
01099 <font class="keywordflow">if</font>(stIn.x<0) stIn.x+= lumelSize;
01100 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(stIn.x><a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>) stIn.x-= lumelSize;
01101 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(stIn.y<0) stIn.y+= lumelSize;
01102 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(stIn.y><a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>) stIn.y-= lumelSize;
01103
01104 <font class="comment">// Get the Uv, in [0,Order?*NL_LUMEL_BY_TILE] basis (ie lumel basis), and get from this patch</font>
01105 sint u, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
01106 u= (sint)floor(stIn.x*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
01107 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (sint)floor(stIn.y*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
01108 <a class="code" href="classNL3D_1_1CPatch.html#z682_7">computeTileLightmapPixel</a>(u>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, u&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), dest);
01109 }
01110 }
01111 <font class="comment">// else it is on a corner of the patch.</font>
01112 <font class="keywordflow">else</font>
01113 {
01114 <font class="comment">// if the corner of the patch (same as tile corner) is smoothed, find on neighbor</font>
01115 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#z668_1">getCornerSmoothFlag</a>(corner))
01116 {
01117 <font class="comment">// retrieve neigbhor info. NB: use edgeId=corner, (corner X is the start of the edge X)it works.</font>
01118 <a class="code" href="classNL3D_1_1CPatch.html#a13">getBindNeighbor</a>(corner, bindInfo);
01119
01120 <font class="comment">// if neighbor present.</font>
01121 <font class="keywordflow">if</font>(bindInfo.Zone)
01122 {
01123 <font class="comment">// Ok, search uv on this patch.</font>
01124 uvLocator.build(<font class="keyword">this</font>, corner, bindInfo);
01125 patchId= uvLocator.selectPatch(stIn);
01126 uvLocator.locateUV(stIn, patchId, patchOut, stOut);
01127
01128 <font class="comment">// same reasoning as in computeDisplaceCornerSmooth(), must find the pixel on the neighbor </font>
01129 <font class="comment">// of our neighbor. But the current corner may be a corner on a bind X/1. All is managed by doing</font>
01130 <font class="comment">// this way.</font>
01131 patchOut->computeTileLightmapPixelAroundCorner(stOut, dest, <font class="keyword">true</font>);
01132 }
01133 }
01134 }
01135 }
01136
01137 }
01138
01139
01140 }
01141
01142
01143 <font class="comment">// ***************************************************************************</font>
<a name="l01144"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_0">01144</a> <font class="keywordtype">void</font> CPatch::getTileLightMap(uint ts, uint tt, CPatchRdrPass *&rdrpass)
01145 {
01146 <font class="comment">// TessBlocks must have been allocated.</font>
01147 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>.size()!=0);
01148
01149 <font class="comment">// get what tessBlock to use.</font>
01150 uint numtb, numtm;
01151 <a class="code" href="classNL3D_1_1CPatch.html#c35">computeTbTm</a>(numtb, numtm, ts, tt);
01152 CTessBlock &tessBlock= <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numtb];
01153
01154 <font class="comment">// If the lightmap Id has not been computed, compute it.</font>
01155 <font class="keywordflow">if</font>(tessBlock.LightMapRefCount==0)
01156 {
01157 <font class="comment">// Compute the lightmap texture, with help of TileColors, with neighboring info etc...</font>
01158 CRGBA lightText[<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>];
01159 <a class="code" href="classNL3D_1_1CPatch.html#z682_3">computeNearBlockLightmap</a>(ts&(~1), tt&(~1), lightText);
01160
01161 <font class="comment">// Create a rdrPass with this texture, donlod to Driver etc...</font>
01162 tessBlock.LightMapId= <a class="code" href="classNL3D_1_1CPatch.html#o0">Zone</a>->Landscape->getTileLightMap(lightText, rdrpass);
01163
01164 <font class="comment">// store this rdrpass ptr.</font>
01165 tessBlock.LightMapRdrPass= rdrpass;
01166 }
01167
01168 <font class="comment">// We are using this 2x2 tiles lightmap.</font>
01169 tessBlock.LightMapRefCount++;
01170
01171
01172 <font class="comment">// get the rdrpass ptr of the tessBlock lightmap</font>
01173 rdrpass= tessBlock.LightMapRdrPass;
01174 }
01175
01176
01177 <font class="comment">// ***************************************************************************</font>
<a name="l01178"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_1">01178</a> <font class="keywordtype">void</font> CPatch::getTileLightMapUvInfo(uint ts, uint tt, CVector &uvScaleBias)
01179 {
01180 <font class="comment">// TessBlocks must have been allocated.</font>
01181 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>.size()!=0);
01182
01183 <font class="comment">// get what tessBlock to use.</font>
01184 uint numtb, numtm;
01185 <a class="code" href="classNL3D_1_1CPatch.html#c35">computeTbTm</a>(numtb, numtm, ts, tt);
01186 CTessBlock &tessBlock= <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numtb];
01187
01188 <font class="comment">// Get the uvScaleBias for the tile 0,0 of the block.</font>
01189 <a class="code" href="classNL3D_1_1CPatch.html#o0">Zone</a>->Landscape->getTileLightMapUvInfo(tessBlock.LightMapId, uvScaleBias);
01190
01191 <font class="comment">// Must increment the bias, for the good tile in the 2x2 block Lightmap.</font>
01192 uint tsDec= ts & 1;
01193 uint ttDec= tt & 1;
01194 uvScaleBias.x+= tsDec * uvScaleBias.z;
01195 uvScaleBias.y+= ttDec * uvScaleBias.z;
01196 }
01197
01198
01199 <font class="comment">// ***************************************************************************</font>
<a name="l01200"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_2">01200</a> <font class="keywordtype">void</font> CPatch::releaseTileLightMap(uint ts, uint tt)
01201 {
01202 <font class="comment">// TessBlocks must have been allocated.</font>
01203 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>.size()!=0);
01204
01205 <font class="comment">// get what tessBlock to use.</font>
01206 uint numtb, numtm;
01207 <a class="code" href="classNL3D_1_1CPatch.html#c35">computeTbTm</a>(numtb, numtm, ts, tt);
01208 CTessBlock &tessBlock= <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numtb];
01209
01210 <font class="comment">// If no more tileMaterial use this lightmap, release it.</font>
01211 <a class="code" href="debug_8h.html#a6">nlassert</a>(tessBlock.LightMapRefCount>0);
01212 tessBlock.LightMapRefCount--;
01213 <font class="keywordflow">if</font>(tessBlock.LightMapRefCount==0)
01214 {
01215 <a class="code" href="classNL3D_1_1CPatch.html#o0">Zone</a>->Landscape->releaseTileLightMap(tessBlock.LightMapId);
01216 }
01217 }
01218
01219 <font class="comment">// ***************************************************************************</font>
<a name="l01220"></a><a class="code" href="classNL3D_1_1CPatch.html#a35">01220</a> <font class="keywordtype">void</font> CPatch::packShadowMap (<font class="keyword">const</font> uint8 *pLumelSrc)
01221 {
01222 <font class="comment">// Number of lumel by lines</font>
01223 uint lumelCount=<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
01224
01225 <font class="comment">// Number of block in a line</font>
01226 <a class="code" href="debug_8h.html#a6">nlassert</a> ((lumelCount&0x3)==0);
01227 uint numLumelBlock=lumelCount>>2;
01228
01229 <font class="comment">// Number of line</font>
01230 uint lineCount=<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
01231
01232 <font class="comment">// Number of block line</font>
01233 <a class="code" href="debug_8h.html#a6">nlassert</a> ((lineCount&0x3)==0);
01234 uint numLineBlock=lineCount>>2;
01235
01236 <font class="comment">// Resize the compressed buffer</font>
01237 <a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>.resize (numLumelBlock*numLineBlock*<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>);
01238
01239 <font class="comment">// Input of compresed data</font>
01240 uint8 *compressedData=&<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[0];
01241
01242 <font class="comment">// Each line block</font>
01243 <font class="keywordflow">for</font> (uint lineBlock=0; lineBlock<numLineBlock; lineBlock++)
01244 {
01245 <font class="comment">// Block pointer</font>
01246 <font class="keyword">const</font> uint8 *blockLine=pLumelSrc;
01247
01248 <font class="comment">// Each lumel block</font>
01249 <font class="keywordflow">for</font> (uint lumelBlock=0; lumelBlock<numLumelBlock; lumelBlock++)
01250 {
01251 <font class="comment">// *** Unpack the block</font>
01252 uint countU;
01253
01254 <font class="comment">// Last block ?</font>
01255 <font class="keywordflow">if</font> (lumelBlock==numLumelBlock-1)
01256 countU=lumelCount&3;
01257 <font class="keywordflow">else</font>
01258 countU=4;
01259
01260 <font class="comment">// Destination lumel</font>
01261 <font class="keyword">const</font> uint8 *blockSrc=blockLine;
01262
01263 <font class="comment">// Temp block</font>
01264 uint8 originalBlock[4*4];
01265
01266 <font class="comment">// Copy the lumels in the bloc</font>
01267 <font class="keywordflow">for</font> (uint <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>++)
01268 {
01269 <font class="keywordflow">for</font> (uint u=0; u<<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; u++)
01270 {
01271 <font class="comment">// Copy the lumel</font>
01272 originalBlock[(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a><<2)+u]=blockSrc[u];
01273 }
01274
01275 <font class="comment">// Next line</font>
01276 blockSrc+=lumelCount;
01277 }
01278
01279 <font class="comment">// Get min and max alpha</font>
01280 uint8 alphaMin=255;
01281 uint8 alphaMax=0;
01282
01283 <font class="comment">// Scan</font>
01284 <font class="keywordflow">for</font> (uint i=0; i<16; i++)
01285 {
01286 <font class="comment">// Min ?</font>
01287 <font class="keywordflow">if</font> (originalBlock[i]<alphaMin)
01288 alphaMin=originalBlock[i];
01289 <font class="keywordflow">if</font> (originalBlock[i]>alphaMax)
01290 alphaMax=originalBlock[i];
01291 }
01292
01293 <font class="comment">// *** Try to compress by 2 methods</font>
01294
01295 <font class="comment">// Blcok uncompressed</font>
01296 uint8 uncompressedBlock[4*4];
01297
01298 <font class="comment">// Pack the block</font>
01299 <a class="code" href="classNL3D_1_1CPatch.html#c0">packLumelBlock</a> (compressedData, originalBlock, alphaMin, alphaMax);
01300
01301 <font class="comment">// Unpack the block</font>
01302 <a class="code" href="classNL3D_1_1CPatch.html#c2">unpackLumelBlock</a> (uncompressedBlock, compressedData);
01303
01304 <font class="comment">// Eval error</font>
01305 uint firstMethod=<a class="code" href="classNL3D_1_1CPatch.html#c1">evalLumelBlock</a> (originalBlock, uncompressedBlock, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
01306
01307 <font class="comment">// second compression</font>
01308 uint8 secondCompressedBlock[<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>];
01309 <a class="code" href="classNL3D_1_1CPatch.html#c0">packLumelBlock</a> (secondCompressedBlock, originalBlock, alphaMax, alphaMin);
01310
01311 <font class="comment">// Unpack the block</font>
01312 <a class="code" href="classNL3D_1_1CPatch.html#c2">unpackLumelBlock</a> (uncompressedBlock, secondCompressedBlock);
01313
01314 <font class="comment">// Eval error</font>
01315 uint secondMethod=<a class="code" href="classNL3D_1_1CPatch.html#c1">evalLumelBlock</a> (originalBlock, uncompressedBlock, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>, <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>);
01316
01317 <font class="comment">// Second best ?</font>
01318 <font class="keywordflow">if</font> (secondMethod<firstMethod)
01319 {
01320 <font class="comment">// Copy compressed data</font>
01321 memcpy (compressedData, secondCompressedBlock, <a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>);
01322 }
01323
01324 <font class="comment">// Next source block</font>
01325 compressedData+=<a class="code" href="patch_8h.html#a8">NL_BLOCK_LUMEL_COMPRESSED_SIZE</a>;
01326
01327 <font class="comment">// Next block on the line</font>
01328 blockLine+=4;
01329 }
01330
01331 <font class="comment">// Next line of block</font>
01332 pLumelSrc+=lumelCount*4;
01333 }
01334 }
01335
01336 <font class="comment">// ***************************************************************************</font>
<a name="l01337"></a><a class="code" href="classNL3D_1_1CPatch.html#a36">01337</a> <font class="keywordtype">void</font> CPatch::resetCompressedLumels ()
01338 {
01339 <font class="comment">// Number of lumel by lines</font>
01340 uint lumelCount=<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
01341
01342 <font class="comment">// Number of block in a line</font>
01343 <a class="code" href="debug_8h.html#a6">nlassert</a> ((lumelCount&0x3)==0);
01344 uint numLumelBlock=lumelCount>>2;
01345
01346 <font class="comment">// Number of line</font>
01347 uint lineCount=<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>*<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>;
01348
01349 <font class="comment">// Number of block line</font>
01350 <a class="code" href="debug_8h.html#a6">nlassert</a> ((lineCount&0x3)==0);
01351 uint numLineBlock=lineCount>>2;
01352
01353 <font class="comment">// Size of the lumel array</font>
01354 uint size=numLineBlock*numLumelBlock*8;
01355
01356 <font class="comment">// 4 bits per lumel</font>
01357 <a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>.resize (size);
01358
01359 <font class="comment">// No line have shadows.</font>
01360 memset (&<a class="code" href="classNL3D_1_1CPatch.html#m3">CompressedLumels</a>[0], 0, size);
01361 }
01362
01363
01364 <font class="comment">// ***************************************************************************</font>
01365 <font class="comment">// ***************************************************************************</font>
01366 <font class="comment">// Functions (C/ASM).</font>
01367 <font class="comment">// ***************************************************************************</font>
01368 <font class="comment">// ***************************************************************************</font>
01369
01370
01371 <font class="comment">// ***************************************************************************</font>
<a name="l01372"></a><a class="code" href="patch__lightmap_8cpp.html#a0">01372</a> <font class="preprocessor">#define a00 tex[0]</font>
<a name="l01373"></a><a class="code" href="patch__lightmap_8cpp.html#a1">01373</a> <font class="preprocessor"></font><font class="preprocessor">#define a10 tex[1]</font>
<a name="l01374"></a><a class="code" href="patch__lightmap_8cpp.html#a2">01374</a> <font class="preprocessor"></font><font class="preprocessor">#define a20 tex[2]</font>
<a name="l01375"></a><a class="code" href="patch__lightmap_8cpp.html#a3">01375</a> <font class="preprocessor"></font><font class="preprocessor">#define a30 tex[3]</font>
<a name="l01376"></a><a class="code" href="patch__lightmap_8cpp.html#a4">01376</a> <font class="preprocessor"></font><font class="preprocessor">#define a40 tex[4]</font>
01377 <font class="preprocessor"></font>
<a name="l01378"></a><a class="code" href="patch__lightmap_8cpp.html#a5">01378</a> <font class="preprocessor">#define a01 tex[5]</font>
<a name="l01379"></a><a class="code" href="patch__lightmap_8cpp.html#a6">01379</a> <font class="preprocessor"></font><font class="preprocessor">#define a11 tex[6]</font>
<a name="l01380"></a><a class="code" href="patch__lightmap_8cpp.html#a7">01380</a> <font class="preprocessor"></font><font class="preprocessor">#define a21 tex[7]</font>
<a name="l01381"></a><a class="code" href="patch__lightmap_8cpp.html#a8">01381</a> <font class="preprocessor"></font><font class="preprocessor">#define a31 tex[8]</font>
<a name="l01382"></a><a class="code" href="patch__lightmap_8cpp.html#a9">01382</a> <font class="preprocessor"></font><font class="preprocessor">#define a41 tex[9]</font>
01383 <font class="preprocessor"></font>
<a name="l01384"></a><a class="code" href="patch__lightmap_8cpp.html#a10">01384</a> <font class="preprocessor">#define a02 tex[10]</font>
<a name="l01385"></a><a class="code" href="patch__lightmap_8cpp.html#a11">01385</a> <font class="preprocessor"></font><font class="preprocessor">#define a12 tex[11]</font>
<a name="l01386"></a><a class="code" href="patch__lightmap_8cpp.html#a12">01386</a> <font class="preprocessor"></font><font class="preprocessor">#define a22 tex[12]</font>
<a name="l01387"></a><a class="code" href="patch__lightmap_8cpp.html#a13">01387</a> <font class="preprocessor"></font><font class="preprocessor">#define a32 tex[13]</font>
<a name="l01388"></a><a class="code" href="patch__lightmap_8cpp.html#a14">01388</a> <font class="preprocessor"></font><font class="preprocessor">#define a42 tex[14]</font>
01389 <font class="preprocessor"></font>
<a name="l01390"></a><a class="code" href="patch__lightmap_8cpp.html#a15">01390</a> <font class="preprocessor">#define a03 tex[15]</font>
<a name="l01391"></a><a class="code" href="patch__lightmap_8cpp.html#a16">01391</a> <font class="preprocessor"></font><font class="preprocessor">#define a13 tex[16]</font>
<a name="l01392"></a><a class="code" href="patch__lightmap_8cpp.html#a17">01392</a> <font class="preprocessor"></font><font class="preprocessor">#define a23 tex[17]</font>
<a name="l01393"></a><a class="code" href="patch__lightmap_8cpp.html#a18">01393</a> <font class="preprocessor"></font><font class="preprocessor">#define a33 tex[18]</font>
<a name="l01394"></a><a class="code" href="patch__lightmap_8cpp.html#a19">01394</a> <font class="preprocessor"></font><font class="preprocessor">#define a43 tex[19]</font>
01395 <font class="preprocessor"></font>
<a name="l01396"></a><a class="code" href="patch__lightmap_8cpp.html#a20">01396</a> <font class="preprocessor">#define a04 tex[20]</font>
<a name="l01397"></a><a class="code" href="patch__lightmap_8cpp.html#a21">01397</a> <font class="preprocessor"></font><font class="preprocessor">#define a14 tex[21]</font>
<a name="l01398"></a><a class="code" href="patch__lightmap_8cpp.html#a22">01398</a> <font class="preprocessor"></font><font class="preprocessor">#define a24 tex[22]</font>
<a name="l01399"></a><a class="code" href="patch__lightmap_8cpp.html#a23">01399</a> <font class="preprocessor"></font><font class="preprocessor">#define a34 tex[23]</font>
<a name="l01400"></a><a class="code" href="patch__lightmap_8cpp.html#a24">01400</a> <font class="preprocessor"></font><font class="preprocessor">#define a44 tex[24]</font>
01401 <font class="preprocessor"></font>
01402 <font class="keywordtype">void</font> <a class="code" href="namespaceNL3D.html#a390">NL3D_bilinearTileLightMap</a>(CRGBA *tex)
01403 {
01404 <font class="comment">// Fast bilinear of a 5x5 tile.</font>
01405 <font class="comment">// Corners must be set.</font>
01406 <font class="comment">// Later: pass it to ASM.</font>
01407
01408 <font class="comment">// Fill first column 0 and column 4.</font>
01409 <a class="code" href="patch__lightmap_8cpp.html#a10">a02</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a0">a00</a>, <a class="code" href="patch__lightmap_8cpp.html#a20">a04</a>);
01410 <a class="code" href="patch__lightmap_8cpp.html#a5">a01</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a0">a00</a>, <a class="code" href="patch__lightmap_8cpp.html#a10">a02</a>);
01411 <a class="code" href="patch__lightmap_8cpp.html#a15">a03</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a10">a02</a>, <a class="code" href="patch__lightmap_8cpp.html#a20">a04</a>);
01412 <a class="code" href="patch__lightmap_8cpp.html#a14">a42</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a4">a40</a>, <a class="code" href="patch__lightmap_8cpp.html#a24">a44</a>);
01413 <a class="code" href="patch__lightmap_8cpp.html#a9">a41</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a4">a40</a>, <a class="code" href="patch__lightmap_8cpp.html#a14">a42</a>);
01414 <a class="code" href="patch__lightmap_8cpp.html#a19">a43</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a14">a42</a>, <a class="code" href="patch__lightmap_8cpp.html#a24">a44</a>);
01415
01416 <font class="comment">// Fill Line 0.</font>
01417 <a class="code" href="patch__lightmap_8cpp.html#a2">a20</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a0">a00</a>, <a class="code" href="patch__lightmap_8cpp.html#a4">a40</a>);
01418 <a class="code" href="patch__lightmap_8cpp.html#a1">a10</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a0">a00</a>, <a class="code" href="patch__lightmap_8cpp.html#a2">a20</a>);
01419 <a class="code" href="patch__lightmap_8cpp.html#a3">a30</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a2">a20</a>, <a class="code" href="patch__lightmap_8cpp.html#a4">a40</a>);
01420
01421 <font class="comment">// Fill Line 1.</font>
01422 <a class="code" href="patch__lightmap_8cpp.html#a7">a21</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a5">a01</a>, <a class="code" href="patch__lightmap_8cpp.html#a9">a41</a>);
01423 <a class="code" href="patch__lightmap_8cpp.html#a6">a11</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a5">a01</a>, <a class="code" href="patch__lightmap_8cpp.html#a7">a21</a>);
01424 <a class="code" href="patch__lightmap_8cpp.html#a8">a31</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a7">a21</a>, <a class="code" href="patch__lightmap_8cpp.html#a9">a41</a>);
01425
01426 <font class="comment">// Fill Line 2. </font>
01427 <a class="code" href="patch__lightmap_8cpp.html#a12">a22</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a10">a02</a>, <a class="code" href="patch__lightmap_8cpp.html#a14">a42</a>);
01428 <a class="code" href="patch__lightmap_8cpp.html#a11">a12</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a10">a02</a>, <a class="code" href="patch__lightmap_8cpp.html#a12">a22</a>);
01429 <a class="code" href="patch__lightmap_8cpp.html#a13">a32</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a12">a22</a>, <a class="code" href="patch__lightmap_8cpp.html#a14">a42</a>);
01430
01431 <font class="comment">// Fill Line 3. </font>
01432 <a class="code" href="patch__lightmap_8cpp.html#a17">a23</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a15">a03</a>, <a class="code" href="patch__lightmap_8cpp.html#a19">a43</a>);
01433 <a class="code" href="patch__lightmap_8cpp.html#a16">a13</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a15">a03</a>, <a class="code" href="patch__lightmap_8cpp.html#a17">a23</a>);
01434 <a class="code" href="patch__lightmap_8cpp.html#a18">a33</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a17">a23</a>, <a class="code" href="patch__lightmap_8cpp.html#a19">a43</a>);
01435
01436 <font class="comment">// Fill Line 4. </font>
01437 <a class="code" href="patch__lightmap_8cpp.html#a22">a24</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a20">a04</a>, <a class="code" href="patch__lightmap_8cpp.html#a24">a44</a>);
01438 <a class="code" href="patch__lightmap_8cpp.html#a21">a14</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a20">a04</a>, <a class="code" href="patch__lightmap_8cpp.html#a22">a24</a>);
01439 <a class="code" href="patch__lightmap_8cpp.html#a23">a34</a>.avg2(<a class="code" href="patch__lightmap_8cpp.html#a22">a24</a>, <a class="code" href="patch__lightmap_8cpp.html#a24">a44</a>);
01440
01441 }
01442
01443
01444 <font class="comment">// ***************************************************************************</font>
01445 <font class="comment">// ***************************************************************************</font>
01446 <font class="comment">// Lightmap get interface.</font>
01447 <font class="comment">// ***************************************************************************</font>
01448 <font class="comment">// ***************************************************************************</font>
01449
01450
01451 <font class="comment">// ***************************************************************************</font>
<a name="l01452"></a><a class="code" href="classNL3D_1_1CPatch.html#z671_0">01452</a> uint8 CPatch::getLumel(<font class="keyword">const</font> CUV &uv)<font class="keyword"> const</font>
01453 <font class="keyword"></font>{
01454 <font class="comment">// compute tile coord and lumel coord.</font>
01455 sint ts, tt;
01456 <font class="comment">// get in lumel coord.</font>
01457 sint <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>= (<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a><<<a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>);
01458 sint h= (<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a><<<a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>);
01459 <font class="comment">// fastFloor: use a precision of 256 to avoid doing OptFastFloorBegin.</font>
01460 <font class="comment">// add 128, to round and get cneter of lumel.</font>
01461 ts= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(uv.U* (<a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a><<8) + 128); ts>>=8;
01462 tt= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(uv.V* (h<<8) + 128); tt>>=8;
01463 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(ts, 0, <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>-1);
01464 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(tt, 0, h-1);
01465 <font class="comment">// get the lumel</font>
01466 uint8 ret;
01467 <a class="code" href="classNL3D_1_1CPatch.html#z686_4">getTileLumelmapPixelPrecomputed</a>(ts>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>, tt>><a class="code" href="patch_8h.html#a6">NL_LUMEL_BY_TILE_SHIFT</a>,
01468 ts&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), tt&(<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1), ret);
01469
01470 <font class="keywordflow">return</font> ret;
01471 }
01472
01473
01474 <font class="comment">// ***************************************************************************</font>
01475 <font class="comment">// ***************************************************************************</font>
01476 <font class="comment">// TileLightInfluences</font>
01477 <font class="comment">// ***************************************************************************</font>
01478 <font class="comment">// ***************************************************************************</font>
01479
01480
01481 <font class="comment">// ***************************************************************************</font>
<a name="l01482"></a><a class="code" href="classNL3D_1_1CPatch.html#z675_0">01482</a> <font class="keywordtype">void</font> CPatch::resetTileLightInfluences()
01483 {
01484 <font class="comment">// Fill default.</font>
01485 <a class="code" href="classNL3D_1_1CPatch.html#m6">TileLightInfluences</a>.resize((<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>/2 +1) * (<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>/2 +1));
01486 <font class="comment">// Disable All light influence on all points</font>
01487 <font class="keywordflow">for</font>(uint i=0;i <<a class="code" href="classNL3D_1_1CPatch.html#m6">TileLightInfluences</a>.size(); i++)
01488 {
01489 <font class="comment">// Disable all light influence on this point.</font>
01490 <a class="code" href="classNL3D_1_1CPatch.html#m6">TileLightInfluences</a>[i].Light[0]= 0xFF;
01491 }
01492 }
01493
01494
01495 <font class="comment">// ***************************************************************************</font>
<a name="l01496"></a><a class="code" href="classNL3D_1_1CPatch.html#z671_1">01496</a> <font class="keywordtype">void</font> CPatch::appendTileLightInfluences(<font class="keyword">const</font> CUV &uv,
01497 std::vector<CPointLightInfluence> &pointLightList)<font class="keyword"> const</font>
01498 <font class="keyword"></font>{
01499 <font class="comment">// Compute TLI coord for BiLinear.</font>
01500 sint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
01501 <font class="comment">// There is (OrderS/2+1) * (OrderT/2+1) tileLightInfluences (TLI).</font>
01502 sint <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>= (<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>>>1);
01503 sint h= (<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>>>1);
01504 sint wTLI= <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>+1;
01505 <font class="comment">// fastFloor: use a precision of 256 to avoid doing OptFastFloorBegin.</font>
01506 <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(uv.U * (<a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a><<8));
01507 <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= <a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(uv.V * (h<<8));
01508 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, 0, <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a><<8);
01509 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, 0, h<<8);
01510 <font class="comment">// compute the TLI coord, and the subCoord for bilinear.</font>
01511 sint xTLI,yTLI, xSub, ySub;
01512 xTLI= <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>>>8; <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(xTLI, 0, <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>-1);
01513 yTLI= <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>>>8; <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(yTLI, 0, h-1);
01514 <font class="comment">// Hence, xSub and ySub range is [0, 256].</font>
01515 xSub= <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a> - (xTLI<<8);
01516 ySub= <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a> - (yTLI<<8);
01517
01518
01519 <font class="comment">// Use a CLightInfluenceInterpolator to biLinear light influence</font>
01520 CLightInfluenceInterpolator interp;
01521 <font class="comment">// Must support only 2 light per TLI.</font>
01522 <a class="code" href="debug_8h.html#a6">nlassert</a>(CTileLightInfluence::NumLightPerCorner==2);
01523 <a class="code" href="debug_8h.html#a6">nlassert</a>(CLightInfluenceInterpolator::NumLightPerCorner==2);
01524 <font class="comment">// Get ref on array of PointLightNamed.</font>
01525 CPointLightNamed *zonePointLights= NULL;
01526 <font class="keywordflow">if</font>( <a class="code" href="classNL3D_1_1CPatch.html#a5">getZone</a>()->_PointLightArray.getPointLights().size() >0 )
01527 {
01528 <font class="comment">// const_cast, because will only change _IdInfluence, and </font>
01529 <font class="comment">// also because CLightingManager will call appendLightedModel()</font>
01530 zonePointLights= const_cast<CPointLightNamed*>(&(<a class="code" href="classNL3D_1_1CPatch.html#a5">getZone</a>()->_PointLightArray.getPointLights()[0]));
01531 }
01532 <font class="comment">// For 4 corners.</font>
01533 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><2;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
01534 {
01535 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><2;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
01536 {
01537 <font class="comment">// get ref on TLI, and on corner.</font>
01538 <font class="keyword">const</font> CTileLightInfluence &tli= <a class="code" href="classNL3D_1_1CPatch.html#m6">TileLightInfluences</a>[ (yTLI+<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>)*wTLI + xTLI+<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a> ];
01539 CLightInfluenceInterpolator::CCorner &corner= interp.Corners[<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*2 + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>];
01540 <font class="comment">// For all lights</font>
01541 uint lid;
01542 <font class="keywordflow">for</font>(lid= 0; lid<CTileLightInfluence::NumLightPerCorner; lid++)
01543 {
01544 <font class="comment">// get the id of the light in the zone</font>
01545 uint tliLightId= tli.Light[lid];
01546 <font class="comment">// If empty id, stop</font>
01547 <font class="keywordflow">if</font>(tliLightId==0xFF)
01548 <font class="keywordflow">break</font>;
01549 <font class="keywordflow">else</font>
01550 {
01551 <font class="comment">// Set pointer of the light in the corner</font>
01552 corner.Lights[lid]= zonePointLights + tliLightId;
01553 }
01554 }
01555 <font class="comment">// Reset Empty slots.</font>
01556 <font class="keywordflow">for</font>(; lid<CTileLightInfluence::NumLightPerCorner; lid++)
01557 {
01558 <font class="comment">// set to NULL</font>
01559 corner.Lights[lid]= NULL;
01560 }
01561 }
01562 }
01563 <font class="comment">// interpolate.</font>
01564 interp.interpolate(pointLightList, xSub/256.f, ySub/256.f);
01565 }
01566
01567
01568 <font class="comment">// ***************************************************************************</font>
01569 CRGBA CPatch::getCurrentTLIColor(uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>)<font class="keyword"> const</font>
01570 <font class="keyword"></font>{
01571 CRGBA ret;
01572 ret= CRGBA::Black;
01573
01574 <font class="comment">// if at least the zone has pointLights, add them.</font>
01575 <font class="keywordflow">if</font>( <a class="code" href="classNL3D_1_1CPatch.html#a5">getZone</a>()->_PointLightArray.getPointLights().size() >0 )
01576 {
01577 <font class="keyword">const</font> CPointLightNamed *zonePointLights;
01578 zonePointLights= (&(<a class="code" href="classNL3D_1_1CPatch.html#a5">getZone</a>()->_PointLightArray.getPointLights()[0]));
01579
01580 uint wTLI= (<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>>>1)+1;
01581
01582 <font class="keyword">const</font> CTileLightInfluence &tli= <a class="code" href="classNL3D_1_1CPatch.html#m6">TileLightInfluences</a>[ <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*wTLI + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>];
01583 <font class="keywordflow">for</font>(uint lid=0;lid<CTileLightInfluence::NumLightPerCorner;lid++)
01584 {
01585 <font class="comment">// Not influenced by a pointLight?, stop</font>
01586 <font class="keywordflow">if</font>(tli.Light[lid]==0xFF)
01587 <font class="keywordflow">break</font>;
01588 <font class="comment">// Append the influence of this pointLight. </font>
01589 CRGBA lightCol= zonePointLights[tli.Light[lid]].getDiffuse();
01590 <font class="comment">// modulate with landscape Material.</font>
01591 lightCol.modulateFromColorRGBOnly(lightCol, <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getPointLightDiffuseMaterial() );
01592 <font class="comment">// modulate with precomputed diffuse factor</font>
01593 lightCol.modulateFromuiRGBOnly(lightCol, tli.getDiffuseLightFactor(lid) );
01594 <font class="comment">// add to the corner</font>
01595 ret.addRGBOnly(ret, lightCol);
01596 }
01597 }
01598
01599 <font class="keywordflow">return</font> ret;
01600 }
01601
01602
01603 <font class="comment">// ***************************************************************************</font>
<a name="l01604"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_19">01604</a> <font class="keywordtype">void</font> CPatch::getCurrentTileTLIColors(uint ts, uint tt, <a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> corners[4])
01605 {
01606 <font class="comment">// Get ref on array of PointLightNamed.</font>
01607 <font class="keywordflow">if</font>( <a class="code" href="classNL3D_1_1CPatch.html#a5">getZone</a>()->_PointLightArray.getPointLights().size() >0 )
01608 {
01609 <font class="comment">// get coord of the tessBlock</font>
01610 uint tbs= ts>>1;
01611 uint tbt= tt>>1;
01612 <font class="comment">// get tile id local to tessBlock.</font>
01613 uint tls= ts-(tbs<<1);
01614 uint tlt= tt-(tbt<<1);
01615
01616 <font class="comment">// For each corner of the tessBlock, compute lighting with pointLights.</font>
01617 CRGBA tbCorners[4];
01618 <font class="keywordflow">for</font>(uint <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><2;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
01619 {
01620 <font class="keywordflow">for</font>(uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><2;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
01621 {
01622 CRGBA &cornerCol= tbCorners[<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*2+<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>];
01623 cornerCol= getCurrentTLIColor(tbs+<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, tbt+<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>);
01624 }
01625 }
01626
01627 <font class="comment">// Then biLinear to tile Level (tessBlock==2x2 tiles).</font>
01628 CRGBA tbEdges[4];
01629 CRGBA tbMiddle;
01630 <font class="comment">// left.</font>
01631 tbEdges[0].avg2RGBOnly(tbCorners[0], tbCorners[2]);
01632 <font class="comment">// bottom</font>
01633 tbEdges[1].avg2RGBOnly(tbCorners[2], tbCorners[3]);
01634 <font class="comment">// right</font>
01635 tbEdges[2].avg2RGBOnly(tbCorners[1], tbCorners[3]);
01636 <font class="comment">// up</font>
01637 tbEdges[3].avg2RGBOnly(tbCorners[0], tbCorners[1]);
01638 <font class="comment">// middle.</font>
01639 tbMiddle.avg2RGBOnly(tbEdges[0], tbEdges[2]);
01640
01641 <font class="comment">// just copy result according to tile pos in tessBlock.</font>
01642 <font class="keywordflow">if</font>(tlt==0)
01643 {
01644 <font class="keywordflow">if</font>(tls==0)
01645 {
01646 corners[0]= tbCorners[0];
01647 corners[1]= tbEdges[3];
01648 corners[2]= tbEdges[0];
01649 corners[3]= tbMiddle;
01650 }
01651 <font class="keywordflow">else</font>
01652 {
01653 corners[0]= tbEdges[3];
01654 corners[1]= tbCorners[1];
01655 corners[2]= tbMiddle;
01656 corners[3]= tbEdges[2];
01657 }
01658 }
01659 <font class="keywordflow">else</font>
01660 {
01661 <font class="keywordflow">if</font>(tls==0)
01662 {
01663 corners[0]= tbEdges[0];
01664 corners[1]= tbMiddle;
01665 corners[2]= tbCorners[2];
01666 corners[3]= tbEdges[1];
01667 }
01668 <font class="keywordflow">else</font>
01669 {
01670 corners[0]= tbMiddle;
01671 corners[1]= tbEdges[2];
01672 corners[2]= tbEdges[1];
01673 corners[3]= tbCorners[3];
01674 }
01675 }
01676 }
01677 <font class="keywordflow">else</font>
01678 {
01679 <font class="comment">// Just fill with 0s.</font>
01680 corners[0]= CRGBA::Black;
01681 corners[1]= CRGBA::Black;
01682 corners[2]= CRGBA::Black;
01683 corners[3]= CRGBA::Black;
01684 }
01685 }
01686
01687 <font class="comment">// ***************************************************************************</font>
<a name="l01688"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_20">01688</a> <font class="keywordtype">void</font> CPatch::addTileLightmapWithTLI(uint ts, uint tt, <a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>)
01689 {
01690 <font class="comment">// compute colors ar corners of the tile.</font>
01691 CRGBA corners[4];
01692 <a class="code" href="classNL3D_1_1CPatch.html#z682_19">getCurrentTileTLIColors</a>(ts, tt, corners);
01693
01694 <font class="comment">// Bilinear accross the tile, and add to dest.</font>
01695 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
01696 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
01697 {
01698 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
01699 {
01700 <font class="comment">// compute this pixel, and add</font>
01701 <a class="code" href="namespaceNL3D.html#a389">bilinearColorAndAdd</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, dest[<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a> + <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>]);
01702 }
01703 }
01704 }
01705
01706 <font class="comment">// ***************************************************************************</font>
<a name="l01707"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_21">01707</a> <font class="keywordtype">void</font> CPatch::addTileLightmapEdgeWithTLI(uint ts, uint tt, uint edge, <a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> *dest, uint <a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>, <font class="keywordtype">bool</font> inverse)
01708 {
01709 <font class="comment">// compute colors ar corners of the tile.</font>
01710 CRGBA corners[4];
01711 <a class="code" href="classNL3D_1_1CPatch.html#z682_19">getCurrentTileTLIColors</a>(ts, tt, corners);
01712
01713 <font class="comment">// get coordinate according to edge.</font>
01714 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0,<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;
01715 <font class="keywordflow">switch</font>(edge)
01716 {
01717 <font class="keywordflow">case</font> 0: <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= 0; <font class="keywordflow">break</font>;
01718 <font class="keywordflow">case</font> 1: <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1; <font class="keywordflow">break</font>;
01719 <font class="keywordflow">case</font> 2: <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= <a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1; <font class="keywordflow">break</font>;
01720 <font class="keywordflow">case</font> 3: <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= 0; <font class="keywordflow">break</font>;
01721 };
01722
01723 <font class="comment">// For all lumel of the edge, bilinear.</font>
01724 uint i;
01725 <font class="keywordflow">for</font>(i=0; i<<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>; i++)
01726 {
01727 <font class="comment">// if vertical edge</font>
01728 <font class="keywordflow">if</font>( (edge&1)==0 ) <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>= i;
01729 <font class="comment">// else horizontal edge</font>
01730 <font class="keywordflow">else</font> <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>= i;
01731
01732 <font class="comment">// manage inverse.</font>
01733 uint where;
01734 <font class="keywordflow">if</font>(inverse) where= (<a class="code" href="patch_8h.html#a7">NL_LUMEL_BY_TILE</a>-1)-i;
01735 <font class="keywordflow">else</font> where= i;
01736 <font class="comment">// compute this pixel, and modulate</font>
01737 <a class="code" href="namespaceNL3D.html#a389">bilinearColorAndAdd</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, dest[where*<a class="code" href="driver__opengl__extension__def_8h.html#a374">stride</a>]);
01738 }
01739 }
01740
01741 <font class="comment">// ***************************************************************************</font>
<a name="l01742"></a><a class="code" href="classNL3D_1_1CPatch.html#z682_22">01742</a> <font class="keywordtype">void</font> CPatch::addTileLightmapPixelWithTLI(uint ts, uint tt, uint <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, uint <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, <a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> *dest)
01743 {
01744 <font class="comment">// compute colors ar corners of the tile.</font>
01745 CRGBA corners[4];
01746 <a class="code" href="classNL3D_1_1CPatch.html#z682_19">getCurrentTileTLIColors</a>(ts, tt, corners);
01747
01748 <font class="comment">// compute this pixel, and modulate</font>
01749 <a class="code" href="namespaceNL3D.html#a389">bilinearColorAndAdd</a>(corners, <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a384">t</a>, *dest);
01750 }
01751
01752
01753 <font class="comment">// ***************************************************************************</font>
<a name="l01754"></a><a class="code" href="classNL3D_1_1CPatch.html#z671_2">01754</a> <font class="keywordtype">void</font> CPatch::computeCurrentTLILightmap(<a class="code" href="classNLMISC_1_1CRGBA.html">NLMISC::CRGBA</a> *array)<font class="keyword"> const</font>
01755 <font class="keyword"></font>{
01756 <font class="comment">// Size of TileLightInfluences</font>
01757 uint wTLI= (<a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>>>1)+1;
01758 uint hTLI= (<a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>>>1)+1;
01759 <font class="comment">// colros at corners of tiles size.</font>
01760 uint wTC= <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>+1;
01761 uint wTCx2= wTC*2;
01762 uint hTC= <a class="code" href="classNL3D_1_1CPatch.html#o3">OrderT</a>+1;
01763 uint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>;
01764
01765 <font class="comment">// Compute TLI colors at each corner of each TessBlocks.</font>
01766 <font class="comment">//=============</font>
01767 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><hTLI;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
01768 {
01769 <font class="comment">// store every 2 tiles corners.</font>
01770 CRGBA *dst= array + <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*2*wTC;
01771 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><wTLI;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>++)
01772 {
01773 *dst= getCurrentTLIColor(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>);
01774 <font class="comment">// skip 2 tiles corners.</font>
01775 dst++;
01776 dst++;
01777 }
01778 }
01779
01780 <font class="comment">// Compute TLI colors at each corner of each Tiles.</font>
01781 <font class="comment">//=============</font>
01782
01783 <font class="comment">// Compute corner at middle of vertical TessBlock edges.</font>
01784 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><hTC-1;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>+=2)
01785 {
01786 CRGBA *dst= array + <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*wTC;
01787 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><wTC;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+=2)
01788 {
01789 <font class="comment">// Average midlle with cur and next.</font>
01790 (dst+wTC)->avg2RGBOnly(*dst, *(dst + wTCx2) );
01791
01792 <font class="comment">// skip 2 tiles corners.</font>
01793 dst++;
01794 dst++;
01795 }
01796 }
01797
01798 <font class="comment">// Compute corner at middle of horizontal TessBlock edges, and at middle of TessBlock.</font>
01799 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a><hTC;<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>++)
01800 {
01801 CRGBA *dst= array + <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>*wTC;
01802 <font class="keywordflow">for</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=0;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a><wTC-1;<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>+=2)
01803 {
01804 <font class="comment">// Average midlle with cur and next.</font>
01805 (dst+1)->avg2RGBOnly(*dst, *(dst+2));
01806
01807 <font class="comment">// skip 2 tiles corners.</font>
01808 dst++;
01809 dst++;
01810 }
01811 }
01812
01813
01814 }
01815
01816
01817
01818 <font class="comment">// ***************************************************************************</font>
01819 <font class="comment">// ***************************************************************************</font>
01820 <font class="comment">// UpdateLighting.</font>
01821 <font class="comment">// ***************************************************************************</font>
01822 <font class="comment">// ***************************************************************************</font>
01823
01824
01825 <font class="comment">// ***************************************************************************</font>
<a name="l01826"></a><a class="code" href="classNL3D_1_1CPatch.html#z676_0">01826</a> <font class="keywordtype">void</font> CPatch::linkBeforeNearUL(CPatch *patchNext)
01827 {
01828 <a class="code" href="debug_8h.html#a6">nlassert</a>(patchNext);
01829
01830 <font class="comment">// first, unlink others from me. NB: works even if _ULNearPrec==_ULNearNext==this.</font>
01831 <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>->_ULNearPrec= <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>;
01832 <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>->_ULNearNext= <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>;
01833 <font class="comment">// link to igNext.</font>
01834 <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>= patchNext;
01835 <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>= patchNext->_ULNearPrec;
01836 <font class="comment">// link others to me.</font>
01837 <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>->_ULNearPrec= <font class="keyword">this</font>;
01838 <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>->_ULNearNext= <font class="keyword">this</font>;
01839 }
01840
01841
01842 <font class="comment">// ***************************************************************************</font>
<a name="l01843"></a><a class="code" href="classNL3D_1_1CPatch.html#z676_1">01843</a> <font class="keywordtype">void</font> CPatch::unlinkNearUL()
01844 {
01845 <font class="comment">// first, unlink others from me. NB: works even if _ULNearPrec==_ULNearNext==this.</font>
01846 <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>->_ULNearPrec= <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>;
01847 <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>->_ULNearNext= <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>;
01848 <font class="comment">// reset</font>
01849 <a class="code" href="classNL3D_1_1CPatch.html#z687_0">_ULNearPrec</a>= <font class="keyword">this</font>;
01850 <a class="code" href="classNL3D_1_1CPatch.html#z687_1">_ULNearNext</a>= <font class="keyword">this</font>;
01851 }
01852
01853
01854 <font class="comment">// ***************************************************************************</font>
<a name="l01855"></a><a class="code" href="classNL3D_1_1CPatch.html#z676_4">01855</a> uint CPatch::updateTessBlockLighting(uint numTb)
01856 {
01857 <font class="comment">// TessBlocks must have been allocated and tessBlockId must be ok.</font>
01858 <a class="code" href="debug_8h.html#a6">nlassert</a>(numTb<<a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>.size());
01859
01860 <font class="comment">// compute tessBlock coordinate</font>
01861 uint tbWidth= <a class="code" href="classNL3D_1_1CPatch.html#o2">OrderS</a>>>1;
01862 uint ts= numTb&(tbWidth-1);
01863 uint tt= numTb/tbWidth;
01864 <font class="comment">// expand to tile coordinate.</font>
01865 ts*= 2;
01866 tt*= 2;
01867
01868 <font class="comment">// get what tessBlock to use.</font>
01869 CTessBlock &tessBlock= <a class="code" href="classNL3D_1_1CPatch.html#z678_1">TessBlocks</a>[numTb];
01870
01871 <font class="comment">// If the lightmap Id has not been computed, quit</font>
01872 <font class="keywordflow">if</font>(tessBlock.LightMapRefCount==0)
01873 <font class="keywordflow">return</font> 0;
01874 <font class="keywordflow">else</font>
01875 {
01876 <font class="comment">// Recompute the lightmap texture, with help of TileColors, with neighboring info etc...</font>
01877 CRGBA lightText[<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>];
01878 <a class="code" href="classNL3D_1_1CPatch.html#z682_3">computeNearBlockLightmap</a>(ts&(~1), tt&(~1), lightText);
01879
01880 <font class="comment">// donlod this texture to Driver etc...</font>
01881 <a class="code" href="classNL3D_1_1CPatch.html#o0">Zone</a>->Landscape->refillTileLightMap(tessBlock.LightMapId, lightText);
01882
01883 <font class="comment">// return number of pixels computed.</font>
01884 <font class="keywordflow">return</font> <a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>*<a class="code" href="texture__near_8h.html#a0">NL_TILE_LIGHTMAP_SIZE</a>;
01885 }
01886 }
01887
01888
01889 <font class="comment">// ***************************************************************************</font>
01890 <font class="comment">// ***************************************************************************</font>
01891 <font class="comment">// ***************************************************************************</font>
01892 <font class="comment">// ***************************************************************************</font>
01893
01894
01895 <font class="comment">// ***************************************************************************</font>
<a name="l01896"></a><a class="code" href="classNL3D_1_1CPatch.html#z688_0">01896</a> <font class="keywordtype">void</font> CPatch::addRefDLMContext()
01897 {
01898 <font class="comment">// the patch must be compiled.</font>
01899 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#o0">Zone</a>);
01900
01901 <font class="comment">// if 0, create the context.</font>
01902 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#z688_3">_DLMContextRefCount</a>==0)
01903 {
01904 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>==NULL);
01905 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>= <font class="keyword">new</font> CPatchDLMContext;
01906 <font class="comment">// init now the context.</font>
01907 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->generate(<font class="keyword">this</font>, <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getTextureDLM(), <a class="code" href="classNL3D_1_1CPatch.html#a4">getLandscape</a>()->getPatchDLMContextList());
01908
01909 <font class="comment">// If the patch is visible, it may have Far Vertices created, </font>
01910 <font class="comment">// hence, we must refill them with good DLM Uvs.</font>
01911 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CPatch.html#o26">RenderClipped</a>)
01912 {
01913 <font class="comment">// setup DLM Uv with new _DLMContext</font>
01914 <a class="code" href="classNL3D_1_1CPatch.html#z673_8">fillVBFarsDLMUvOnly</a>();
01915 }
01916 }
01917
01918 <font class="comment">// incRef.</font>
01919 <a class="code" href="classNL3D_1_1CPatch.html#z688_3">_DLMContextRefCount</a>++;
01920 }
01921
01922 <font class="comment">// ***************************************************************************</font>
<a name="l01923"></a><a class="code" href="classNL3D_1_1CPatch.html#z688_1">01923</a> <font class="keywordtype">void</font> CPatch::decRefDLMContext(uint count)
01924 {
01925 <font class="comment">// the patch must be compiled.</font>
01926 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#o0">Zone</a>);
01927 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_3">_DLMContextRefCount</a>>0);
01928
01929 <font class="comment">// dec Ref.</font>
01930 <a class="code" href="classNL3D_1_1CPatch.html#z688_3">_DLMContextRefCount</a>-= count;
01931 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_3">_DLMContextRefCount</a>>=0);
01932
01933 <font class="comment">// If 0, delete the context.</font>
01934 <font class="keywordflow">if</font>(<a class="code" href="classNL3D_1_1CPatch.html#z688_3">_DLMContextRefCount</a>==0)
01935 {
01936 <font class="keyword">delete</font> <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>;
01937 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>= NULL;
01938
01939 <font class="comment">// If the patch is visible, it may have Far Vertices created, </font>
01940 <font class="comment">// hence, we must reset their DLM Uvs (to point to black pixel)</font>
01941 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CPatch.html#o26">RenderClipped</a>)
01942 {
01943 <font class="comment">// setup DLM Uv with new _DLMContext</font>
01944 <a class="code" href="classNL3D_1_1CPatch.html#z673_8">fillVBFarsDLMUvOnly</a>();
01945 }
01946 }
01947 }
01948
01949
01950 <font class="comment">// ***************************************************************************</font>
<a name="l01951"></a><a class="code" href="classNL3D_1_1CPatch.html#z677_0">01951</a> <font class="keywordtype">void</font> CPatch::beginDLMLighting()
01952 {
01953 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>);
01954
01955 <font class="comment">// Must bkup prec pointLightCount in OldPointLightCount, and reset CurPointLightCount</font>
01956 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->OldPointLightCount= <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->CurPointLightCount;
01957 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->CurPointLightCount= 0;
01958
01959 <font class="comment">// clear lighting, only if patch is visible</font>
01960 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CPatch.html#o26">RenderClipped</a>)
01961 <font class="comment">// NB: no-op if src is already full black.</font>
01962 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->clearLighting();
01963
01964 }
01965
01966 <font class="comment">// ***************************************************************************</font>
<a name="l01967"></a><a class="code" href="classNL3D_1_1CPatch.html#z677_1">01967</a> <font class="keywordtype">void</font> CPatch::processDLMLight(CPatchDLMPointLight &pl)
01968 {
01969 <font class="comment">// add reference to currentLight, creating DLMContext if needed</font>
01970 <a class="code" href="classNL3D_1_1CPatch.html#z688_0">addRefDLMContext</a>();
01971
01972 <font class="comment">// add curLight counter</font>
01973 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->CurPointLightCount++;
01974
01975 <font class="comment">// compute lighting, only if patch is visible</font>
01976 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CPatch.html#o26">RenderClipped</a>)
01977 <a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->addPointLightInfluence(pl);
01978 }
01979
01980 <font class="comment">// ***************************************************************************</font>
<a name="l01981"></a><a class="code" href="classNL3D_1_1CPatch.html#z677_2">01981</a> <font class="keywordtype">void</font> CPatch::endDLMLighting()
01982 {
01983 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>);
01984
01985 <font class="comment">// delete reference from old pointLight influences, at prec render() pass. _DLMContext may be deleted here,</font>
01986 <font class="comment">// if no more lights use it, and if the patch is not in Near.</font>
01987 <a class="code" href="classNL3D_1_1CPatch.html#z688_1">decRefDLMContext</a>(<a class="code" href="classNL3D_1_1CPatch.html#z688_2">_DLMContext</a>->OldPointLightCount);
01988 }
01989
01990
01991 } <font class="comment">// NL3D</font>
01992
</pre></div>
<!-- footer -->
<BR><FONT Size=+5> </FONT>
</TD>
<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD>
</TR>
</TABLE>
</BODY>
</HTML>
|