ofs | hex dump | ascii |
---|
0000 | 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 00 00 00 01 00 08 06 00 00 00 5c 72 a8 | .PNG........IHDR.............\r. |
0020 | 66 00 00 00 06 62 4b 47 44 00 ff 00 ff 00 ff a0 bd a7 93 00 00 00 09 70 48 59 73 00 00 0e c3 00 | f....bKGD..............pHYs..... |
0040 | 00 0e c3 01 c7 6f a8 64 00 00 00 07 74 49 4d 45 07 e0 06 09 13 14 36 d7 ac 54 ed 00 00 20 00 49 | .....o.d....tIME......6..T.....I |
0060 | 44 41 54 78 da ec bd 7b b0 65 e9 55 1f f6 5b df 63 ef 7d ce b9 af ee be dd 3d 3d d3 f3 d0 73 66 | DATx...{.e.U..[.c.}......==...sf |
0080 | 34 48 a2 25 64 30 20 cb 48 aa 08 4f 08 04 03 06 57 4c 4c 42 2a a9 20 59 26 81 a2 70 0a 17 e5 c4 | 4H.%d0..H..O....WLLB*..Y&..p.... |
00a0 | 54 2a d8 02 19 c9 06 1c ca 18 07 07 61 10 e2 0f bb 12 1c 4b 40 88 13 40 40 24 81 84 35 30 a3 51 | T*..........a......K@..@@$..50.Q |
00c0 | 34 8f ee e9 e9 be 8f 73 ef 39 7b 7f 8f b5 f2 c7 f7 7d fb ee 7b fa 8e 3c d2 cc 34 9a e9 fd eb ba | 4......s.9{......}..{..<..4..... |
00e0 | d5 b7 6f 9f 7b ef 39 67 ef b5 be b5 7e eb b7 d6 02 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 | ..o.{.9g....~....F..1b...#F..1b. |
0100 | 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c | ..#F..1b...#F..1b...#F..1b...#F. |
0120 | 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 | .1b...#F..1b...#F..1b...#F..1b.. |
0140 | 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 | .#F..1b...#F..1b...#F..1b...#F.. |
0160 | 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 | 1b...#F..1b...#F..1b...#F..1b... |
0180 | 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 | #F..1b...#F..1b...#F..1b...#F..1 |
01a0 | 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 | b...#F..1b...#F..1b...#F..1b...# |
01c0 | 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 | F..1b...#F..1b...#F..1b...#F..1b |
01e0 | c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 11 23 46 | ...#F..1b...#F..1b...#F..1b...#F |
0200 | 8c 18 31 62 c4 88 11 23 46 8c 18 31 62 c4 88 e7 0e ba 55 5e e8 03 af b9 6f 02 e0 fd 20 fa cf 89 | ..1b...#F..1b.....U^....o....... |
0220 | 0c d6 d6 66 98 4e a7 98 4c 26 b8 f3 ce 3b b1 b9 b9 09 22 82 73 0e 31 46 30 33 42 08 60 66 18 63 | ...f.N..L&...;....".s.1F03B.`f.c |
0240 | 50 d7 35 00 60 3e 9f e3 b1 c7 1e c3 c1 c1 01 f6 f7 f7 b1 b3 b3 83 f5 f5 75 4c a7 93 5f 23 a2 6f | P.5.`>..................uL.._#.o |
0260 | ff dd df fd e8 de 78 5b dd 1c 7c f9 97 bf 7e 53 20 bf d8 2e bb 77 1c 1e 1e e2 f4 e9 d3 d8 d8 d8 | ......x[..|...~S.....w.......... |
0280 | c0 c6 c6 06 ee be fb 6e 6c 6c 6c 80 99 b1 58 2c e0 bd 87 88 40 44 40 44 68 9a 06 eb eb eb 20 22 | .......nlll...X,....@D@Dh......" |
02a0 | 3c fd f4 d3 78 f4 d1 47 71 78 78 98 3f 0e 60 ad 41 d3 34 0f 55 b6 fa aa ff e7 b7 7f 67 e7 a5 fa | <...x..Gqxx.?.`.A.4.U.......g... |
02c0 | 1e 9a 5b e5 66 59 9b cd 20 22 60 16 74 3e 40 44 00 00 22 82 10 02 62 8c 20 a2 fe eb 44 04 63 4c | ..[.fY..."`.t>@D.."...b.....D.cL |
02e0 | ff 79 79 2c 33 83 99 7b 27 51 3e 0f 21 40 11 8d 56 79 33 4f 2f a5 00 70 7f 8c 11 51 7f ad ca f5 | .yy,3..{'Q>.!@..Vy3O/..p...Q.... |
0300 | 2a d7 73 f5 df ab 5f 1f 7e 6f 79 1c 73 44 8c fe 25 7d 51 6f 19 07 30 99 4c 20 80 8d 21 c2 85 43 | *.s..._.~oy.sD..%}Qo..0.L...!..C |
0320 | 10 11 94 52 b0 d6 a2 ae 6b 54 55 75 cc c0 01 40 29 d5 ff 5d 9c c3 f0 31 e5 f3 10 02 42 08 20 8c | ...R....kTUu...@)..]...1....B... |
0340 | 0e e0 cf 2c 88 5d 79 eb 57 8d 7f 15 27 39 80 72 bd 89 14 36 36 36 50 55 f5 ae 48 8c a3 03 78 29 | ...,.]y.W...'9.r...666PU..H...x) |
0360 | dc 26 44 44 8a 2e 86 7c 3d cb 05 d7 5a c3 18 03 6b 2d 44 a4 3f d9 87 37 90 d6 1a 4d d3 00 00 bc | .&DD...|=...Z...k-D.?..7...M.... |
0380 | f7 30 c6 f4 37 0b 80 1c 05 f0 68 8b 37 19 5a 6b 30 73 4d 48 7f 4a 24 56 22 ba e2 a0 8b 13 1f 5e | .0..7.....h.7.Zk0sMH.J$V"......^ |
03a0 | b3 92 ee 95 eb 5c fe 5f 29 95 fe ad 0d 48 d1 f9 e0 a2 1e 1d c0 4b 00 21 46 25 41 b6 62 08 c7 c2 | .....\._)....H.......K.!F%A.b... |
03c0 | c5 61 c8 48 2b 21 7c 39 19 56 43 c7 e2 3c ca e3 09 02 02 ce d2 98 03 dc 64 88 66 8e 17 98 23 44 | .a.H+!|9.VC..<..........d.f...#D |
03e0 | 70 43 84 16 07 ce 7e f5 da 0e af eb ea f5 2d 1f 31 72 c7 fc 79 c2 88 d1 01 bc 98 4e 0b c5 ce bb | pC....~.......-.1r..y......N.... |
0400 | c5 90 0c 2a 37 ca 30 ec 3f 29 cc 27 a2 63 ff 5f 6e 20 ad 35 b4 d6 20 a5 20 cc 4b 11 f1 a3 51 de | ...*7.0.?).'.c._n..5......K...Q. |
0420 | 3c 74 6d cb 22 51 62 64 88 f0 91 43 ce 0e 7a 78 e2 af 5e bb 12 15 30 73 ef 0c 8e 45 7f 2c a8 26 | <tm."Qbd...C..zx..^...0s...E.,.& |
0440 | d5 6e 5d d7 7e 74 00 2f 01 44 66 13 43 bc 10 42 38 76 5a ac 86 fc c3 8f f4 d8 e4 00 42 08 bd 23 | .n].~t./.Df.C..B8vZ.........B..# |
0460 | 18 46 0f fd 87 a2 07 44 50 01 38 1c 4d f3 66 05 00 68 98 71 fb f0 04 2f 69 dd 30 9c 1f 3a f5 55 | .F.....DP.8.M.f..h.q.../i.0..:.U |
0480 | 6e a7 44 72 25 62 28 a9 03 20 00 70 fe a5 1e d2 dd 32 0e c0 3b c7 9d f3 7b 3e 04 28 65 6e 08 f7 | n.Dr%b(....p.....2..;...{>.(en.. |
04a0 | 56 4f f8 61 14 40 94 f2 cb 72 43 ad 86 92 5a 69 28 45 fb 31 62 24 02 6e 2a b1 23 0c c0 0d a3 fb | VO.a.@...rC...Zi(E.1b$.n*.#..... |
04c0 | a1 53 2e 27 fc f0 5a af 46 02 c5 01 0c ab 3a fd cf 02 96 20 7a 49 93 80 ea 96 89 00 62 60 e1 78 | .S.'..Z.F.....:.....zI......b`.x |
04e0 | 2d dd 08 b8 c1 01 c8 b3 48 f5 86 8f 1b e6 94 da 18 68 65 e6 a4 46 0a e0 66 82 21 ac 94 8a 4a e9 | -.......H........he..F..f.!...J. |
0500 | e3 9c cc 4a 74 36 e4 6e 4e 4a 05 56 53 84 fe 6f e0 e9 97 38 05 70 eb 38 80 10 a2 10 d1 53 c6 18 | ...Jt6.nNJ.VS..o...8.p.8.....S.. |
0520 | d0 a0 6e bc 7a da af 9e 0e 25 cf 3f 89 1f 28 8f 8f 31 22 c4 70 65 2c 03 de 64 07 10 25 02 d8 2d | ..n.z....%.?..(..1".pe,..d..%..- |
0540 | 39 fc b3 d5 01 0c af f1 33 7d e4 c7 5f 79 a9 bf 87 b7 4c 0a d0 39 0f 00 6d ca fd cc b1 90 f1 99 | 9.......3}.._y....L..9..m....... |
0560 | 08 a3 62 ec 27 b1 c9 c7 22 06 11 68 a3 3d c9 ad ed 00 be e9 9b be 89 6e bb ed 36 cc 66 33 a5 b5 | ..b.'..."..h.=.........n..6.f3.. |
0580 | 96 18 23 9c 73 f2 fe f7 bf ff 05 39 46 09 c4 91 f9 09 16 be f7 99 4e f2 cf 27 04 3a 49 14 94 ee | ..#.s......9F.........N..'.:I... |
05a0 | 87 e4 50 14 d1 4b 5e d5 79 cb 44 00 de 7b 78 ef 33 c9 f3 f9 4f 84 67 3a 41 fa 37 6d 40 34 11 11 | ..P..K^.y.D..{x.3...O.g:A.7m@4.. |
05c0 | b4 31 a8 ab 1a b6 a9 6f 69 07 30 9f cf 71 f5 ea 55 7d 70 70 a0 bd f7 46 29 85 aa aa f0 ce 77 be | .1.....oi.0..q..U}pp...F).....w. |
05e0 | f3 05 f1 8c 5a 6b 18 6d 1c 81 8e 95 f5 86 2c ff d0 b1 0f 6b fd 27 85 ff 47 0e 7f 50 51 18 23 80 | ....Zk.m......,....k.'..G..PQ.#. |
0600 | 97 06 2a 6b 8b 8b 3f d1 c8 87 e5 a0 e2 0c b4 d6 fd df 9f 2f 05 c8 f9 e2 2d 9f 00 7c e4 23 1f 91 | ..*k..?............/....-..|.#.. |
0620 | b7 bd ed 6d ac 94 12 a5 94 34 4d 23 ef 7d ef 7b 5f b0 24 5a 6b 0d 81 0c 14 7c cf 5e 0a fc f9 52 | ...m.....4M#.}.{_.$Zk....|.^...R |
0640 | 80 f2 f3 98 e3 4b fe 8c bc 25 7b 01 5c 88 c7 6e 8a 52 fe 19 7b 01 9e 3b 3e fc e1 0f df b4 4a c8 | .....K...%{.\..n.R..{..;>.....J. |
0660 | f3 d5 0b 30 fc de 14 dd 29 30 c7 5c fa 1d 23 80 97 04 72 2f 00 82 0f f0 71 79 9c 4c 1a 94 fb 56 | ...0....)0.\..#...r/....qy.L...V |
0680 | 6b ca c3 93 61 ec 05 f8 52 c4 73 ef 05 38 29 1a 08 59 31 aa d4 e8 00 5e 1a b7 09 11 40 84 c2 d3 | k...a...R.s..8)..Y1....^....@... |
06a0 | ad de 00 27 91 43 c5 e8 4f 72 04 c5 71 1c 45 11 a3 04 e0 66 43 6b 0d 11 81 56 fa 98 f3 1d 96 03 | ...'.C..Or..q.E....fCk...V...... |
06c0 | 57 43 fe d5 6b 7b 23 01 98 b4 1e 5d d7 a5 a8 10 32 3a 80 97 02 58 44 09 73 cd 91 91 b4 e3 27 13 | WC..k{#....]....2:...XD.s.....'. |
06e0 | 7f 43 d6 7f a8 fa 2b 0d 40 bd fc 77 c5 19 10 51 05 88 1e cd f2 e6 41 44 2c 80 3a 39 77 dc 60 c8 | .C....+.@..w...Q......AD,.:9w.`. |
0700 | ab 8e bb 38 8d f2 79 b9 ce cf d4 0e 2c c2 13 ad b5 1a 1d c0 4b 00 55 5d d7 20 ac 81 08 8b 65 db | ...8..y.....,.......K.U]......e. |
0720 | 77 01 d6 75 8d d9 6c 86 8d 8d 0d 88 08 da b6 3d 36 3c 02 00 8c 31 a8 aa 2a fd 9c aa 3a 26 35 05 | w..u..l........=6<...1..*...:&5. |
0740 | 00 61 06 c7 60 89 46 25 e0 cd 44 e8 dc 29 21 79 43 08 1e 10 f4 5c 8c 73 ae ff 28 58 2d f3 16 f9 | .a..`.F%..D..)!yC....\.s..(X-... |
0760 | 6f 49 e3 ca fd 90 9c 86 c2 d6 a9 d3 98 4d 26 97 40 98 e2 25 2c ef be 75 74 00 ed c2 8b 60 df fb | oI...........M&.@..%,..ut....`.. |
0780 | e7 de 0d 38 7c 6c ba 61 00 22 1c 02 4a 46 b3 bc 99 79 1d 47 00 fb 22 b2 b1 da 0d f8 6c d4 9d cf | ...8|l.a."..JF...y.G..".....l... |
07a0 | d4 0d c8 cc 60 11 30 70 40 f2 d2 76 ea b7 8c 03 58 2c da 98 24 df 7c 83 c8 e7 99 ba 01 8f 1a 43 | ....`.0p@..v....X,..$.|........C |
07c0 | 8e 87 8b c5 01 f4 5a 00 a5 40 50 c0 28 05 fe 82 f1 fd df ff fd e4 9c c3 4f fc c4 4f 7c c1 ce d3 | ......Z..@P.(...........O..O|... |
07e0 | c7 08 ca d7 66 d8 0d 38 ac f7 9f c4 f3 0c 1f 37 74 f2 c3 39 02 e0 ec 18 5e e2 ef ff ad 13 01 74 | ....f..8.......7t..9....^......t |
0800 | 9d 24 2a 00 00 a9 63 46 3e ec 08 1c fe 3d 4c 05 8a b1 97 72 e1 b1 b2 91 52 50 46 e1 56 57 02 9e | .$*...cF>....=L....r....RPF.VW.. |
0820 | 84 8b 77 dc 41 b6 aa b1 b1 b1 8e d9 6c a6 9a a6 a1 d9 6c 46 67 cf 9e 9d 9d 3e 7d ba a9 eb 7a 61 | ..w.A.......l.....lFg....>}...za |
0840 | ad 6d bf ef fb be cf bf e7 3d ef f9 82 ec 4d 22 c0 60 30 1f 1f de 32 fc 58 ad dc 0c d3 81 c2 07 | .m.......=....M".`0...2.X....... |
0860 | 28 a5 7a e3 2f 1d a0 48 33 1e 5e f2 b8 65 1c 40 db 75 fd c5 37 a6 be 21 04 2c 84 df 33 85 89 ab | (.z./..H3.^..e.@.u..7..!.,..3... |
0880 | 9f 0f 1f 6b 6c 85 49 33 81 8c 3a 80 e3 c6 7f 61 9b 98 03 3e f3 99 c7 8b 61 0f 3b eb 76 df f5 ae | ...kl.I3..:....a...>....a.;.v... |
08a0 | 77 3d a0 b5 fe f3 5a eb 4f 57 55 f5 d8 0f fc c0 0f 2c 7e f4 47 7f 34 3c eb 9b d7 9a 1c 9d 09 bc | w=....Z.OWU......,~.G.4<........ |
08c0 | f7 37 34 03 ad 76 03 ae a6 73 ab c4 df 6a 47 e8 ad 80 5b 46 0a 3c 6d 1a 4c 9b 06 75 55 41 a9 e3 | .74..v...s...jG...[F.<m.L..uUA.. |
08e0 | 62 91 1b 7b c1 8f 84 40 d6 da 5e 10 b4 fa d8 63 91 43 4a 42 47 ab 1f e0 b1 27 9f 96 27 9e bc f2 | b..{...@..^....c.CJBG....'..'... |
0900 | 8c 6f ca fb df ff fe 4f 2e 16 8b cf 84 10 5e ae 94 da b0 d6 da 1f fc c1 1f 7c d6 f7 a4 31 06 da | .o.....O......^..........|...1.. |
0920 | 68 28 fd 85 29 01 3f 5f 33 50 a9 f4 a4 d2 6e e8 53 bf d1 01 bc c8 b1 b5 b5 85 cd cd 4d ac cd d6 | h(..).?_3P....n.S...........M... |
0940 | 8e e5 86 25 f7 2b 1f c3 29 40 65 60 68 ea 20 a4 63 0e a0 3c 36 c6 08 ef 7d 62 9d 3b 37 5a fd 17 | ...%.+..)@e`h...c..<6...}b.;7Z.. |
0960 | 88 f7 bd ef 7d 1f 9b cf e7 bf 1f 63 dc 55 4a 79 63 cc b3 f7 a2 99 7d 4d 9f 9f 7c a2 3f 93 03 18 | ....}......c.UJyc.....}M..|.?... |
0980 | f6 fd af f2 06 5a 2b 84 e0 d1 b6 2d ba ee b8 68 ec ef fd 4f ef a6 f7 fd 83 ef 7d c9 84 7a b7 4c | .....Z+....-...h...O......}..z.L |
09a0 | 0a a0 94 4a 21 fa 33 84 79 9f 4f 08 34 ac fb 9f 24 04 4a 6a c0 38 5a f3 17 89 27 9f 7c f2 a9 10 | ...J!.3.y.O.4...$.Jj.8Z...'.|... |
09c0 | 02 9f 3d 7b b6 8f b6 9e 0d ca 49 ad 48 3d ef 42 a0 b6 6d 11 42 e2 80 fe de df 7c 3b 5d bd 76 58 | ..={......I.H=.B..m.B.....|;].vX |
09e0 | 5d 9f fb 3b 1e fd f8 a7 be b2 6e 66 f7 7f ff 7f f1 cd ff c3 df ff 99 0f f9 d1 01 bc 48 e0 63 00 | ]..;......nf................H.c. |
0a00 | 24 49 81 d3 85 ad 7b c7 30 3c 39 ca e9 3e 74 1c 00 7a 1d 40 49 09 ca f7 14 ee 40 1b 03 c8 c8 02 | $I....{.0<9..>t..z.@I.....@..... |
0a20 | 7e 31 f8 d5 5f fd d5 2f ca 7b 52 42 ba 46 2b 42 a0 52 d7 5f 1d e1 36 ec 04 2c d7 99 99 8f 55 0d | ~1.._../.{RB.F+B.R._..6..,....U. |
0a40 | 0a a9 c8 cc b8 f7 8e d9 86 52 ea 35 6b b3 fa ad fb 0b ff b6 c5 e1 c1 25 61 59 8b d1 ff 33 00 7f | .........R.5k..........%aY...3.. |
0a60 | 3a 3a 80 17 0d 09 e8 c5 28 e2 10 3c bc 8f c7 8c 7f 38 3f 2e 84 d0 b3 ff e5 94 49 c4 61 12 89 54 | ::......(..<.....8?.......I.a..T |
0a80 | 55 75 63 9b a9 d6 30 d6 32 48 8d 61 c0 4d 85 0e 45 7b b5 1a 01 14 fe a6 cc 72 1c 46 0d 43 82 b0 | Uuc...0.2H.a.M..E{.......r.F.C.. |
0aa0 | a4 71 43 e7 c0 cc 50 44 d8 9a 56 67 1f b8 6b ed 3d cc fc 3a 8d 78 11 71 51 ed 5d 3d a0 76 b6 81 | .qC...PD..Vg..k.=..:.x.qQ.]=.v.. |
0ac0 | aa 6a 7e 0c c0 37 8e 0e e0 cf 10 3f f4 ee ef a4 18 bd dd b9 f6 34 9e 7a ea 32 ae 5c 7d 1a de 7b | .j~..7.....?.........4.z.2.\}..{ |
0ae0 | d8 4a a3 ae 1b 88 28 34 4d 83 e9 b4 92 6b 87 44 4b 2f 2c 42 00 9d 4c 04 0d 7b c9 57 f3 c6 e1 0d | .J....(4M....k.DK/,B..L..{.W.... |
0b00 | b2 4a 34 81 19 88 51 b4 56 f8 4b 5f 79 af 75 0c 12 21 90 56 60 f6 f0 61 09 8a 11 1b 5b 9b d8 dc | .J4...Q.V.K_y.u..!.V`..a....[... |
0b20 | dc 02 01 08 31 c2 fb 08 e6 88 d6 79 44 31 98 4c 6a 58 6b 60 35 a0 21 98 35 95 51 44 3a 84 80 d6 | ....1......yD1.LjXk`5.!.5.QD:... |
0b40 | 75 10 28 28 63 52 6d 5a 28 95 1f 49 27 0e a2 6b 11 38 a2 ae 27 a8 9a 1a 9a 08 4a 69 18 a5 a1 0d | u.((cRmZ(..I'..k.8..'.....Ji.... |
0b60 | 20 1c a0 08 20 6d 20 10 f8 c8 08 2c 29 23 ca 04 a6 10 72 38 cd 88 02 c4 c8 08 3e 64 45 5d ca b7 | .....m.....,)#....r8......>dE].. |
0b80 | 03 03 fb 7b 07 08 91 31 9d d4 d8 5c ab c0 b1 55 5a 02 ce 6c 6e c4 ad ad cd c8 4a 61 77 af c3 72 | ...{...1...\...UZ..ln.....Jaw..r |
0ba0 | b9 a4 e8 17 c6 2d 0e a7 ad f3 d3 a5 8b d3 65 00 0b d5 f3 cd 8d f5 c5 e6 da 24 4c 27 86 d3 eb 50 | .....-........e..........$L'...P |
0bc0 | 70 de 63 b9 5c 62 d9 2e 10 63 00 29 0d 63 2b 40 08 ce 31 9c f3 88 12 61 b5 81 d5 8a 9f 6c a3 8a | p.c.\b...c.).c+@..1....a.....l.. |
0be0 | 31 ca 50 ca 3b 0c ff 4f ba 86 27 5d db 21 ca 08 30 6d 0c 4e af 99 3b 43 b7 b8 7b 11 18 ae 5d 00 | 1.P.;..O..'].!..0m.N..;C..{...]. |
0c00 | ee 10 6e 79 00 40 63 52 4d ff a3 ef 78 fb 97 df f1 d0 b5 e5 2e a3 56 67 4e 9f 81 31 76 f1 6b bf | ..ny.@cRM...x.........VgN..1v.k. |
0c20 | f6 af e3 e8 00 6e 16 48 ee 00 e4 6f 11 a1 63 19 54 6e 85 00 08 88 04 42 42 cc 14 37 27 11 ce 85 | .....n.H...o..c.Tn.....BB..7'... |
0c40 | af 09 21 c2 28 0d a5 f4 0d e1 a2 88 c0 e6 b9 01 c3 0e c1 55 41 c9 6a 37 e0 7c 3e 87 c4 ee 81 f3 | ..!.(..............UA.j7.|>..... |
0c60 | 5b f5 df 75 a2 1c 11 19 00 42 24 10 08 48 06 2d c5 24 20 56 79 80 80 e4 8f f4 7c d3 39 96 67 16 | [..u.....B$..H.-.$.Vy.....|.9.g. |
0c80 | 2a 25 02 6c 02 f2 8a 54 f1 c6 d1 63 45 d2 5f e8 f9 af fe b3 f4 fb e4 a8 24 49 65 52 81 40 92 5c | *%.l...T...cE._.........$IeR.@.\ |
0ca0 | 09 92 07 68 ac 56 2d 48 d2 ef 27 a2 34 6f b3 ff ef f2 33 08 90 21 79 96 de 71 ad 8d 22 21 d1 d6 | ...h.V-H..'.4o....3..!y..q.."!.. |
0cc0 | 44 22 38 05 62 a5 09 ca 18 23 34 69 2a 52 db 76 c2 77 4e a2 6c 45 46 6b ab fa b3 93 a6 7e 4a 29 | D"8.b....#4i*R.v.wN.lEFk.....~J) |
0ce0 | 0a 94 fc 4f 49 9e 8e 49 6f d2 7b 46 f9 b5 0c ea f2 44 14 18 7e 12 f7 9a eb 0b 39 b7 ec 42 3f e7 | ...OI..Io.{F.....D..~.....9..B?. |
0d00 | 61 75 ca ef 70 76 c3 d0 c9 17 6e 67 55 27 50 5e bf f7 1e 3e 2a b5 7f 18 01 09 88 ac e0 f4 3a 66 | au..pv....ngU'P^...>*.........:f |
0d20 | 5b 0d 22 13 0e bb 0e 4e e4 ff b2 8a fe b4 8b 42 44 34 01 f0 5d 00 fe 64 74 00 37 09 a1 5b 9e 0b | [."....N.......BD4..]..dt.7..[.. |
0d40 | 21 7c 8f eb 16 12 43 07 e1 00 e1 98 0e e4 40 10 28 68 a7 e0 08 10 18 30 47 e2 28 a2 b4 a5 61 29 | !|....C.......@.(h.....0G.(...a) |
0d60 | b0 94 7e 4a 8e 7f 44 ec 85 1b 4e 93 a1 cc b4 dc 34 07 ed 42 34 aa bb dd 54 fe 06 c5 64 dc 49 6f | ..~J..D...N.....4..B4...T...d.Io |
0d80 | a4 00 04 48 8c 10 30 38 78 04 d7 81 84 10 23 23 c6 00 66 01 87 08 66 82 57 04 12 05 51 80 28 82 | ...H..08x.....##..f...f.W...Q.(. |
0da0 | 87 05 2b a2 c8 11 c1 3b 30 08 14 23 20 c9 55 10 29 44 d2 e0 18 10 a3 4f 37 7d 50 f0 65 ac 95 52 | ..+....;0..#..U.)D.....O7}P.e..R |
0dc0 | 10 ad 53 8b 92 44 90 22 c4 18 20 10 84 98 a2 00 66 0c c6 60 2b 68 55 c8 50 20 72 9a 95 20 1c 21 | ..S..D."........f..`+hU.P.r....! |
0de0 | 48 c3 31 24 0a c0 01 60 01 c7 80 10 15 34 18 44 e9 f5 79 df 41 a0 e1 bb 25 42 88 90 18 41 20 d8 | H.1$...`.....4.D..y.A...%B...A.. |
0e00 | ba c6 44 29 30 4b a3 08 f7 2a 0a f7 aa ec cf 62 be 5e 21 04 08 73 7e 7d 02 0e 3e 0f e5 20 b8 2e | ..D)0K...*.....b.^!..s~}..>..... |
0e20 | c2 39 0f 16 81 84 00 01 21 b8 08 d7 7a 38 27 b0 55 7d c3 b6 a6 a1 a3 1e 32 ff 43 fe e6 86 01 2f | .9......!...z8'.U}......2.C..../ |
0e40 | d9 39 46 ef b0 68 09 7b 5d 03 ab 0c 7c 14 b4 1e 88 9a 10 11 e1 7c 8b 2e f0 3d 5d eb ee 69 63 40 | .9F..h.{]...|........|...=]..ic@ |
0e60 | db b6 30 c6 ac 8f 29 c0 4d c4 c1 ee 15 c4 10 70 b0 73 95 da 83 7d 48 e8 00 89 60 1f e0 a2 4b 17 | ..0...).M......p.s...}H...`...K. |
0e80 | 3a b6 60 67 c1 d0 88 be 01 50 11 d1 51 93 e7 49 c2 9e d5 af 0d 4b 80 27 a6 0d 00 05 d7 62 b9 e7 | :.`g.....P..Q..I.....K.'.....b.. |
0ea0 | 28 e8 64 4a 9c 4f fd ca 28 54 95 86 d6 0a b1 5b 62 b9 1f fb d3 bb e8 d7 a3 cf e1 b8 27 04 4d d0 | (.dJ.O..(T.....[b...........'.M. |
0ec0 | 0a d0 a4 c0 b5 86 31 0a c2 82 2e 30 22 67 e3 e4 01 d9 a5 54 3a 25 b3 16 21 fa 0e 5e 29 18 93 c2 | ......1....0"g.....T:%..!..^)... |
0ee0 | 6a 63 08 d6 28 28 4a cf 09 48 8f 0b 41 e0 43 36 0e 3a 8a 23 14 a1 d7 49 88 10 18 29 3d 50 00 ac | jc..((J..H..A.C6.:.#...I...)=P.. |
0f00 | 56 a8 6b 8d 4d 5b 21 72 8a 42 8c 89 30 5a c1 28 0b 88 87 ef 04 5a 29 4c ad c0 22 00 26 39 2a 17 | V.k.M[!r.B..0Z.(.....Z)L..".&9*. |
0f20 | 02 42 60 68 65 30 31 0a b3 46 a3 b2 1a 31 02 2e 44 b4 4e 50 1b 83 b5 5a c3 35 16 8b b6 45 db b5 | .B`he01..F...1..D.NP...Z.5...E.. |
0f40 | e8 bc 07 48 03 88 f0 be 45 b7 6c b3 43 22 04 26 04 6f 01 b1 37 54 00 4e 9a dc 74 52 1a 30 8c 18 | ...H....E.l.C".&.o..7T.N..tR.0.. |
0f60 | 52 04 70 c4 27 b0 0f 88 dd 12 4a 03 6d eb 70 70 e8 10 38 66 87 1b d0 7a c6 b5 a7 97 58 84 0a 4a | R.p.'.....J.m.pp..8f...z....X..J |
0f80 | e9 fe f0 18 1d c0 4d 82 e5 03 18 12 dc b6 69 b1 56 4d b1 77 a8 11 a3 40 29 40 2b 05 52 00 91 06 | ......M.......i.VM.w...@)@+.R... |
0fa0 | 48 c1 45 85 70 a8 d1 b6 f9 06 19 68 fd 87 37 8d 73 0e 5d d7 1d d3 fa 17 c2 a8 dc 54 43 52 b0 b4 | H.E.p......h..7.s.]........TCR.. |
0fc0 | a2 4e 2a 85 ed 4d 83 a6 22 30 03 21 32 88 80 a6 aa 30 9d 36 b0 5a a3 aa ed 80 44 24 a8 1c 85 fb | .N*..M.."0.!2....0.6.Z....D$.... |
0fe0 | a1 31 e6 3f 20 40 83 7a 67 d1 14 6d ba 1c 39 28 45 04 6b 4c ea 45 18 44 f4 8a 14 8c 2e 32 e5 e4 | .1.?.@.zg..m..9(E.kL.E.D.....2.. |
1000 | 84 4a 12 20 10 70 a1 2d b2 43 89 92 3e 08 80 51 04 a5 55 9a 6e 44 c9 14 88 80 da 68 ac 55 06 95 | .J...p.-.C..>..Q..U.nD.....h.U.. |
1020 | d6 28 e3 cf 99 93 f3 20 22 28 4b a8 8c 86 d2 d4 67 0d c2 92 3a 25 05 f0 3e 62 d1 a5 13 7c 62 0d | .(......"(K.....g...:%..>b...|b. |
1040 | 26 8d 86 56 0a 21 30 9c 27 b8 90 f8 08 21 40 44 23 04 83 45 57 61 77 be c4 ee 61 07 8e 11 4d a5 | &..V.!0.'....!@D#..EWaw...a...M. |
1060 | c0 41 c3 2a 02 91 c0 47 85 a5 10 3a 7f 63 59 77 98 02 9c 54 f7 1f 56 78 86 7c 00 73 99 30 44 50 | .A.*...G...:.cYw...T..Vx.|.s.0DP |
1080 | 0a b0 9a 50 1b 82 69 34 1a 6d c1 ac c1 51 23 46 8d 85 0b d8 9b b7 88 c2 a8 54 84 d1 26 8e 0e e0 | ...P..i4.m...Q#F.........T..&... |
10a0 | 26 62 7d aa a1 20 a8 d4 14 6b 4b 8d ca 68 44 66 68 4d b0 46 e7 1b 58 21 82 b0 74 c0 3c 10 94 23 | &b}......kK..hDfhM.F..X!..t.<..# |
10c0 | 44 e0 58 04 30 5c ff 55 ca 80 c7 56 7f ad ec 91 1b 6a cd 01 82 22 42 53 6b 9c da 68 30 6b 28 19 | D.X.0\.U...V.....j..."BSk..h0k(. |
10e0 | b5 8f 00 11 a6 75 8d d9 6c 02 6b 0c 9a ba 42 5d d7 d0 5a 41 6b 82 51 94 a7 14 09 42 48 1d 68 8e | .....u..l.k...B]..ZAk.Q....BH.h. |
1100 | 19 81 19 c2 a9 24 99 8c 54 72 06 9c 3e 2f f7 a8 56 0a d6 1a 28 ad fa fc 98 40 d0 44 d0 5a 65 47 | .....$..Tr..>/..V...(....@.D.ZeG |
1120 | 48 30 d9 41 00 a9 b5 2d d9 4a 9f 74 23 30 10 98 41 8a d2 69 ae 35 94 4a ce 47 51 72 54 15 08 9a | H0.A...-.J.t#0..A..i.5.J.GQrT... |
1140 | 90 8d 9f fa a8 83 34 41 81 a0 8c 82 36 0a 44 92 a3 86 5c 5e 43 8e 50 c8 60 53 aa fe b9 4b 76 38 | ......4A....6.D...\^C.P.`S...Kv8 |
1160 | 55 6d 30 a3 42 89 50 0a 41 04 08 3e c2 f9 80 f3 a7 66 d8 3d 58 60 67 ef 10 7b f3 05 ae 86 0e 21 | Um0.B.P.A..>.....f.=X`g..{.....! |
1180 | 02 6b d3 0a 9e 15 76 9c 40 bc 9c b8 d9 e9 99 c4 40 c3 66 a0 55 47 50 a2 08 55 48 54 63 60 2d d0 | .k....v.@.......@.f.UGP..UHTc`-. |
11a0 | 58 c2 b4 d6 20 16 08 18 3e 7a 34 5d c4 d5 dd 0e 8e 81 69 a5 31 e1 c5 57 02 f8 f8 e8 00 6e 12 4e | X.......>z4]......i.1..W.....n.N |
11c0 | 9f 3a 95 72 fe 6e 81 c3 45 8b 10 39 9f bc 3a 8b c4 f2 29 48 0a 91 81 a4 18 cd 64 d2 8a de 6c e8 | .:.r.n..E..9..:...)H......d...l. |
11e0 | 08 86 c4 df aa 70 e4 f8 8d a2 fa df 43 84 1c ba 13 98 24 19 20 01 c6 28 58 ad 60 54 32 2c ab 35 | .....p......C.....$....(X.`T2,.5 |
1200 | b4 26 68 45 7d a8 4d 46 a0 ca f4 21 56 f0 f9 a6 75 01 a0 c8 03 ae 2e 45 00 0a 47 23 cb ca 29 5f | .&hE}.MF...!V...u......E..G#..)_ |
#include "log.h"
#include "mapsector.h"
#include "main.h" // dout_client, g_settings
#include "nodedef.h"
#include "mapblock.h"
#include "profiler.h"
#include "settings.h"
#include "util/mathconstants.h"
#include <algorithm>
#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
ClientMap::ClientMap(
Client *client,
IGameDef *gamedef,
MapDrawControl &control,
scene::ISceneNode* parent,
| ..t.{&...Q`.......k.1.W..Q...... |
1360 | 35 f6 84 63 4e 49 90 53 0a ab c0 c8 93 78 84 c1 31 a5 15 65 ae 3e 11 81 74 8e 44 b4 ea 25 bb 22 | 5..cNI.S.....x..1..e.>..t.D..%." |
1380 | d9 f0 03 a7 6a 86 56 50 26 47 16 69 0a 4f ef 50 58 14 98 09 c2 82 da 2a 54 96 20 92 c8 c0 5d 39 | ....j.VP&G.i.O.PX......*T.....]9 |
13a0 | 04 3b e4 48 23 f5 65 f8 10 10 b3 44 7b 78 ad ac b5 c7 72 7f a5 54 2f e8 12 11 18 63 fa 0f a5 ca | .;.H#.e....D{x....r..T/....c.... |
13c0 | 22 d8 88 18 08 3e 70 7e 0f 18 46 31 d8 7b 28 25 fd fb 70 61 ab c1 cc 46 88 9b c3 90 da ae 9b e6 | "....>p~..F1.{(%..pa...F........ |
13e0 | 27 fe f7 7f f2 69 05 e0 e7 46 07 f0 02 c3 79 0f e1 00 06 e0 3c 63 ef c0 a1 f3 29 af af ac 01 37 | '....i...F....y.....<c....)....7 |
1400 | 84 19 a7 50 59 13 41 f5 6b de 08 c3 36 88 12 fa 97 dc be a4 03 ab bd 01 37 0c 10 c9 61 78 3a 06 | ...PY.A.k...6...........7...ax:. |
1420 | 05 3e 26 27 60 f3 8d 7f 44 28 1d 69 d6 49 00 94 5c 37 e7 d7 da 28 50 8e 08 ca 64 e1 28 9c 58 7f | .>&'`...D(.i.I..\7...(P...d.(.X. |
1440 | 8a e0 28 70 1e 60 95 9c c1 50 f8 22 92 4f 77 19 10 9b 04 48 8e 13 04 bd fa 39 47 19 c9 be 18 d4 | ..(p.`...P.".Ow....H.....9G..... |
1460 | d7 bc 53 15 24 3f d3 62 bc 7d 94 93 8b 93 59 17 a0 45 41 1b 02 29 0d 70 4c 79 3e 00 6b 74 1f 45 | ..S.$?.b.}....Y..EA..).pLy>.kt.E |
1480 | 40 e5 58 44 51 aa 84 e4 90 9a f2 a9 4e 22 b0 95 86 70 2e 83 e6 54 88 20 d0 94 de 4b 63 09 b6 52 | @.XDQ.......N"...p...T.....Kc..R |
14a0 | e0 28 88 21 c2 77 01 5a 34 ea ba 42 d3 58 d4 ae 06 8b 07 51 da f3 c0 22 e0 18 11 07 c4 df 90 03 | .(.!.w.Z4..B.X.....Q..."........ |
14c0 | b0 d6 9e b8 d9 79 d8 ea ad f2 73 15 1c 39 5d 1f 18 95 22 28 15 c1 de 21 90 40 23 a5 85 56 2b 9c | .....y....s..9]..."(...!.@#..V+. |
14e0 | 3f 3d c5 da 24 60 f7 7a 07 1f 00 ef dc 96 d6 fa c7 fe ea 9b 5f b3 fc 85 df fa d4 bf 18 1d c0 0b | ?=..$`.z............_........... |
1500 | 88 fd 83 3d 10 00 4b 02 5b 19 54 56 a3 98 87 8f 02 e5 19 4b 17 a1 74 40 1b 08 2e 70 0a 5d 15 41 | ...=..K.[.TV.......K..t@...p.].A |
1520 | e4 38 33 3c 9c 15 37 64 85 cb 50 d0 d5 0a c1 b1 bc 32 b3 fe 31 26 27 00 22 30 25 43 8c 7d 39 5d | .83<..7d..P......2..1&'."0%C.}9] |
1540 | fa a8 41 91 ea 0d 0d 24 7d 68 4d 50 50 54 b6 96 28 18 c5 10 ad 52 e9 4b 0b 22 f1 8d 43 47 08 10 | ..A....$}hMPPT..(....R.K."..CG.. |
1560 | 4a 06 a7 b2 83 2a 29 46 09 fb 25 c7 fd 26 9f f0 40 4a 57 08 49 42 ab 75 aa 1a 60 70 7a 1f 55 fe | J....*)F..%..&..@JW.IB.u..`pz.U. |
1580 | a5 af 58 44 66 08 27 1e 41 e9 b4 42 3b 97 16 00 55 9c 47 7a 3e 25 38 38 32 ed e2 76 b3 63 10 00 | ..XDf.'.A..B;...U.Gz>%882..v.c.. |
15a0 | 3a 1b 1b 92 53 48 0e 36 85 24 ba b8 4f 42 8a 02 92 a6 03 55 65 71 ee cc 29 6c 6e 6c 60 d1 3a 7c | :...SH.6.$..OB.....Ueq..)lnl`.:| |
15c0 | 6e e7 0a 64 ee 7a 87 55 d4 9c 3b 3b 3b 98 4c 26 fd 84 df 42 be ae a6 7d c7 a3 a1 44 5a a6 52 24 | n..d.z.U..;;;.L&...B...}...DZ.R$ |
15e0 | 23 c4 14 01 e8 89 46 a5 04 91 53 99 96 99 10 85 01 10 8c d6 98 4e 35 20 0a bb bb 4b b4 87 fb e0 | #.....F...S..........N5....K.... |
1600 | 18 4f 2b 6b 7f f2 2f bf e9 d5 d3 5f b9 fe
DSTACK(__FUNCTION_NAME);
ClientMapSector *sector = NULL;
//JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
core::map<v2s16, MapSector*>::Node *n = m_sectors.find(p2d);
if(n != NULL)
{
sector = (ClientMapSector*)n->getValue();
assert(sector->getId() == MAPSECTOR_CLIENT);
}
else
{
sector = new ClientMapSector(this, p2d);
{
//JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
m_sectors.insert(p2d, sector);
}
}
sector->deSerialize(is);
}
#endif
void ClientMap::OnRegisterSceneNode()
{
if(IsVisible)
{
SceneManager->registerNodeForRendering(this, scene::ESNRP_SOLID);
SceneManager->registerNodeForRendering(this, scene::ESNRP_TRANSPARENT);
}
ISceneNode::OnRegisterSceneNode();
}
static bool isOccluded(Map *map, v3s16 p0, v3s16 p1, float step, float stepfac,
float start_off, float end_off, u32 needed_count, INodeDefManager *nodemgr)
{
float d0 = (float)BS * p0.getDistanceFrom(p1);
v3s16 u0 = p1 - p0;
v3f uf = v3f(u0.X, u0.Y, u0.Z) * BS;
uf.normalize();
v3f p0f = v3f(p0.X, p0.Y, p0.Z) * BS;
u32 count = 0;
for(float s=start_off; s<d0+end_off; s+=step){
v3f pf = p0f + uf * s;
v3s16 p = floatToInt(pf, BS);
MapNode n = map->getNodeNoEx(p);
bool is_transparent = false;
const ContentFeatures &f = nodemgr->get(n);
if(f.solidness == 0)
is_transparent = (f.visual_solidness != 2);
else
is_transparent = (f.solidness != 2);
if(!is_transparent){
count++;
if(count >= needed_count)
return true;
}
step *= stepfac;
}
return false;
}
void ClientMap::updateDrawList(video::IVideoDriver* driver)
{
ScopeProfiler sp(g_profiler, "CM::updateDrawList()", SPT_AVG);
g_profiler->add("CM::updateDrawList() count", 1);
INodeDefManager *nodemgr = m_gamedef->ndef();
for(std::map<v3s16, MapBlock*>::iterator
i = m_drawlist.begin();
i != m_drawlist.end(); ++i)
{
MapBlock *block = i->second;
block->refDrop();
}
m_drawlist.clear();
m_camera_mutex.Lock();
v3f camera_position = m_camera_position;
v3f camera_direction = m_camera_direction;
f32 camera_fov = m_camera_fov;
m_camera_mutex.Unlock();
// Use a higher fov to accomodate faster camera movements.
// Blocks are cropped better when they are drawn.
// Or maybe they aren't? Well whatever.
camera_fov *= 1.2;
v3s16 cam_pos_nodes = floatToInt(camera_position, BS);
v3s16 box_nodes_d = m_control.wanted_range * v3s16(1,1,1);
v3s16 p_nodes_min = cam_pos_nodes - box_nodes_d;
v3s16 p_nodes_max = cam_pos_nodes + box_nodes_d;
// Take a fair amount as we will be dropping more out later
// Umm... these additions are a bit strange but they are needed.
v3s16 p_blocks_min(
p_nodes_min.X / MAP_BLOCKSIZE - 3,
p_nodes_min.Y / MAP_BLOCKSIZE - 3,
p_nodes_min.Z / MAP_BLOCKSIZE - 3);
v3s16 p_blocks_max(
p_nodes_max.X / MAP_BLOCKSIZE + 1,
p_nodes_max.Y / MAP_BLOCKSIZE + 1,
p_nodes_max.Z / MAP_BLOCKSIZE + 1);
// Number of blocks in rendering range
u32 blocks_in_range = 0;
// Number of blocks occlusion culled
u32 blocks_occlusion_culled = 0;
// Number of blocks in rendering range but don't have a mesh
u32 blocks_in_range_without_mesh = 0;
// Blocks that had mesh that would have been drawn according to
// rendering range (if max blocks limit didn't kick in)
u32 blocks_would_have_drawn = 0;
// Blocks that were drawn and had a mesh
u32 blocks_drawn = 0;
// Blocks which had a corresponding meshbuffer for this pass
//u32 blocks_had_pass_meshbuf = 0;
// Blocks from which stuff was actually drawn
//u32 blocks_without_stuff = 0;
// Distance to farthest drawn block
float farthest_drawn = 0;
for(std::map<v2s16, MapSector*>::iterator
si = m_sectors.begin();
si != m_sectors.end(); ++si)
{
MapSector *sector = si->second;
v2s16 sp = sector->getPos();
if(m_control.range_all == false)
{
if(sp.X < p_blocks_min.X
|| sp.X > p_blocks_max.X
|| sp.Y < p_blocks_min.Z
|| sp.Y > p_blocks_max.Z)
continue;
}
std::list< MapBlock * > sectorblocks;
sector->getBlocks(sectorblocks);
/*
Loop through blocks in sector
*/
u32 sector_blocks_drawn = 0;
std::list< MapBlock * >::iterator i;
for(i=sectorblocks.begin(); i!=sectorblocks.end(); i++)
{
MapBlock *block = *i;
/*
Compare block position to camera position, skip
if not seen on display
*/
float range = 100000 * BS;
if(m_control.range_all == false)
range = m_control.wanted_range * BS;
float d = 0.0;
if(isBlockInSight(block->getPos(), camera_position,
camera_direction, camera_fov,
range, &d) == false)
{
continue;
}
// This is ugly (spherical distance limit?)
/*if(m_control.range_all == false &&
d - 0.5*BS*MAP_BLOCKSIZE > range)
continue;*/
blocks_in_range++;
/*
Ignore if mesh doesn't exist
*/
{
//JMutexAutoLock lock(block->mesh_mutex);
if(block->mesh == NULL){
blocks_in_range_without_mesh++;
continue;
}
}
/*
Occlusion culling
*/
// No occlusion culling when free_move is on and camera is
// inside ground
bool occlusion_culling_enabled = true;
if(g_settings->getBool("free_move")){
MapNode n = getNodeNoEx(cam_pos_nodes);
if(n.getContent() == CONTENT_IGNORE ||
nodemgr->get(n).solidness == 2)
occlusion_culling_enabled = false;
}
v3s16 cpn = block->getPos() * MAP_BLOCKSIZE;
cpn += v3s16(MAP_BLOCKSIZE/2, MAP_BLOCKSIZE/2, MAP_BLOCKSIZE/2);
float step = BS*1;
float stepfac = 1.1;
float startoff = BS*1;
float endoff = -BS*MAP_BLOCKSIZE*1.42*1.42;
v3s16 spn = cam_pos_nodes + v3s16(0,0,0);
s16 bs2 = MAP_BLOCKSIZE/2 + 1;
u32 needed_count = 1;
if(
occlusion_culling_enabled &&
isOccluded(this, spn, cpn + v3s16(0,0,0),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(bs2,bs2,bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(bs2,bs2,-bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(bs2,-bs2,bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(bs2,-bs2,-bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(-bs2,bs2,bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(-bs2,bs2,-bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(-bs2,-bs2,bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(-bs2,-bs2,-bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr)
)
{
blocks_occlusion_culled++;
continue;
}
// This block is in range. Reset usage timer.
block->resetUsageTimer();
// Limit block count in case of a sudden increase
blocks_would_have_drawn++;
if(blocks_drawn >= m_control.wanted_max_blocks
&& m_control.range_all == false
&& d > m_control.wanted_min_range * BS)
continue;
// Add to set
block->refGrab();
m_drawlist[block->getPos()] = block;
sector_blocks_drawn++;
blocks_drawn++;
if(d/BS > farthest_drawn)
farthest_drawn = d/BS;
} // foreach sectorblocks
if(sector_blocks_drawn != 0)
m_last_drawn_sectors.insert(sp);
}
m_control.blocks_would_have_drawn = blocks_would_have_drawn;
m_control.blocks_drawn = blocks_drawn;
m_control.farthest_drawn = farthest_drawn;
g_profiler->avg("CM: blocks in range", blocks_in_range);
g_profiler->avg("CM: blocks occlusion culled", blocks_occlusion_culled);
if(blocks_in_range != 0)
g_profiler->avg("CM: blocks in range without mesh (frac)",
(float)blocks_in_range_without_mesh/blocks_in_range);
g_profiler->avg("CM: blocks drawn", blocks_drawn);
g_profiler->avg("CM: farthest drawn", farthest_drawn);
g_profiler->avg("CM: wanted max blocks", m_control.wanted_max_blocks);
}
struct MeshBufList
{
video::SMaterial m;
std::list<scene::IMeshBuffer*> bufs;
};
struct MeshBufListList
{
std::list<MeshBufList> lists;
void clear()
{
lists.clear();
}
void add(scene::IMeshBuffer *buf)
{
for(std::list<MeshBufList>::iterator i = lists.begin();
i != lists.end(); ++i){
MeshBufList &l = *i;
if(l.m == buf->getMaterial()){
l.bufs.push_back(buf);
return;
}
}
MeshBufList l;
l.m = buf->getMaterial();
l.bufs.push_back(buf);
lists.push_back(l);
}
};
void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
{
DSTACK(__FUNCTION_NAME);
bool is_transparent_pass = pass == scene::ESNRP_TRANSPARENT;
std::string prefix;
if(pass == scene::ESNRP_SOLID)
prefix = "CM: solid: ";
else
prefix = "CM: transparent: ";
/*
This is called two times per frame, reset on the non-transparent one
*/
if(pass == scene::ESNRP_SOLID)
{
m_last_drawn_sectors.clear();
}
bool use_trilinear_filter = g_settings->getBool("trilinear_filter");
bool use_bilinear_filter = g_settings->getBool("bilinear_filter");
bool use_anisotropic_filter = g_settings->getBool("anisotropic_filter");
/*
Get time for measuring timeout.
Measuring time is very useful for long delays when the
machine is swapping a lot.
*/
int time1 = time(0);
/*
Get animation parameters
*/
float animation_time = m_client->getAnimationTime();
int crack = m_client->getCrackLevel();
u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
m_camera_mutex.Lock();
v3f camera_position = m_camera_position;
v3f camera_direction = m_camera_direction;
f32 camera_fov = m_camera_fov;
m_camera_mutex.Unlock();
/*
Get all blocks and draw all visible ones
*/
v3s16 cam_pos_nodes = floatToInt(camera_position, BS);
v3s16 box_nodes_d = m_control.wanted_range * v3s16(1,1,1);
v3s16 p_nodes_min = cam_pos_nodes - box_nodes_d;
v3s16 p_nodes_max = cam_pos_nodes + box_nodes_d;
// Take a fair amount as we will be dropping more out later
// Umm... these additions are a bit strange but they are needed.
v3s16 p_blocks_min(
p_nodes_min.X / MAP_BLOCKSIZE - 3,
p_nodes_min.Y / MAP_BLOCKSIZE - 3,
p_nodes_min.Z / MAP_BLOCKSIZE - 3);
v3s16 p_blocks_max(
p_nodes_max.X / MAP_BLOCKSIZE + 1,
p_nodes_max.Y / MAP_BLOCKSIZE + 1,
p_nodes_max.Z / MAP_BLOCKSIZE + 1);
u32 vertex_count = 0;
u32 meshbuffer_count = 0;
// For limiting number of mesh animations per frame
u32 mesh_animate_count = 0;
u32 mesh_animate_count_far = 0;
// Blocks that were drawn and had a mesh
u32 blocks_drawn = 0;
// Blocks which had a corresponding meshbuffer for this pass
u32 blocks_had_pass_meshbuf = 0;
// Blocks from which stuff was actually drawn
u32 blocks_without_stuff = 0;
/*
Draw the selected MapBlocks
*/
{
ScopeProfiler sp(g_profiler, prefix+"drawing blocks", SPT_AVG);
MeshBufListList drawbufs;
for(std::map<v3s16, MapBlock*>::iterator
i = m_drawlist.begin();
i != m_drawlist.end(); ++i)
{
MapBlock *block = i->second;
// If the mesh of the block happened to get deleted, ignore it
if(block->mesh == NULL)
continue;
float d = 0.0;
if(isBlockInSight(block->getPos(), camera_position,
camera_direction, camera_fov,
100000*BS, &d) == false)
{
continue;
}
// Mesh animation
{
//JMutexAutoLock lock(block->mesh_mutex);
MapBlockMesh *mapBlockMesh = block->mesh;
assert(mapBlockMesh);
// Pretty random but this should work somewhat nicely
bool faraway = d >= BS*50;
//bool faraway = d >= m_control.wanted_range * BS;
if(mapBlockMesh->isAnimationForced() ||
!faraway ||
mesh_animate_count_far < (m_control.range_all ? 200 : 50))
{
bool animated = mapBlockMesh->animate(
faraway,
animation_time,
crack,
daynight_ratio);
if(animated)
mesh_animate_count++;
if(animated && faraway)
mesh_animate_count_far++;
}
else
{
mapBlockMesh->decreaseAnimationForceTimer();
}
}
/*
Get the meshbuffers of the block
*/
{
//JMutexAutoLock lock(block->mesh_mutex);
MapBlockMesh *mapBlockMesh = block->mesh;
assert(mapBlockMesh);
scene::SMesh *mesh = mapBlockMesh->getMesh();
assert(mesh);
u32 c = mesh->getMeshBufferCount();
for(u32 i=0; i<c; i++)
{
scene::IMeshBuffer *buf = mesh->getMeshBuffer(i);
buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter);
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
const video::SMaterial& material = buf->getMaterial();
video::IMaterialRenderer* rnd =
driver->getMaterialRenderer(material.MaterialType);
bool transparent = (rnd && rnd->isTransparent());
if(transparent == is_transparent_pass)
{
if(buf->getVertexCount() == 0)
errorstream<<"Block ["<<analyze_block(block)
<<"] contains an empty meshbuf"<<std::endl;
drawbufs.add(buf);
}
}
}
}
std::list<MeshBufList> &lists = drawbufs.lists;
int timecheck_counter = 0;
for(std::list<MeshBufList>::iterator i = lists.begin();
i != lists.end(); ++i)
{
{
timecheck_counter++;
if(timecheck_counter > 50)
{
timecheck_counter = 0;
int time2 = time(0);
if(time2 > time1 + 4)
{
infostream<<"ClientMap::renderMap(): "
"Rendering takes ages, returning."
<<std::endl;
return;
}
}
}
MeshBufList &list = *i;
driver->setMaterial(list.m);
for(std::list<scene::IMeshBuffer*>::iterator j = list.bufs.begin();
j != list.bufs.end(); ++j)
{
scene::IMeshBuffer *buf = *j;
driver->drawMeshBuffer(buf);
vertex_count += buf->getVertexCount();
meshbuffer_count++;
}
#if 0
/*
Draw the faces of the block
*/
{
//JMutexAutoLock lock(block->mesh_mutex);
MapBlockMesh *mapBlockMesh = block->mesh;
assert(mapBlockMesh);
scene::SMesh *mesh = mapBlockMesh->getMesh();
assert(mesh);
u32 c = mesh->getMeshBufferCount();
bool stuff_actually_drawn = false;
for(u32 i=0; i<c; i++)
{
scene::IMeshBuffer *buf = mesh->getMeshBuffer(i);
const video::SMaterial& material = buf->getMaterial();
video::IMaterialRenderer* rnd =
driver->getMaterialRenderer(material.MaterialType);
bool transparent = (rnd && rnd->isTransparent());
// Render transparent on transparent pass and likewise.
if(transparent == is_transparent_pass)
{
if(buf->getVertexCount() == 0)
errorstream<<"Block ["<<analyze_block(block)
<<"] contains an empty meshbuf"<<std::endl;
/*
This *shouldn't* hurt too much because Irrlicht
doesn't change opengl textures if the old
material has the same texture.
*/
driver->setMaterial(buf->getMaterial());
driver->drawMeshBuffer(buf);
vertex_count += buf->getVertexCount();
meshbuffer_count++;
stuff_actually_drawn = true;
}
}
if(stuff_actually_drawn)
blocks_had_pass_meshbuf++;
else
blocks_without_stuff++;
}
#endif
}
} // ScopeProfiler
// Log only on solid pass because values are the same
if(pass == scene::ESNRP_SOLID){
g_profiler->avg("CM: animated meshes", mesh_animate_count);
g_profiler->avg("CM: animated meshes (far)", mesh_animate_count_far);
}
g_profiler->avg(prefix+"vertices drawn", vertex_count);
if(blocks_had_pass_meshbuf != 0)
g_profiler->avg(prefix+"meshbuffers per block",
(float)meshbuffer_count / (float)blocks_had_pass_meshbuf);
if(blocks_drawn != 0)
g_profiler->avg(prefix+"empty blocks (frac)",
(float)blocks_without_stuff / blocks_drawn);
/*infostream<<"renderMap(): is_transparent_pass="<<is_transparent_pass
<<", rendered "<<vertex_count<<" vertices."<<std::endl;*/
}
static bool getVisibleBrightness(Map *map, v3f p0, v3f dir, float step,
float step_multiplier, float start_distance, float end_distance,
INodeDefManager *ndef, u32 daylight_factor, float sunlight_min_d,
int *result, bool *sunlight_seen)
{
int brightness_sum = 0;
int brightness_count = 0;
float distance = start_distance;
dir.normalize();
v3f pf = p0;
pf += dir * distance;
int noncount = 0;
bool nonlight_seen = false;
bool allow_allowing_non_sunlight_propagates = false;
bool allow_non_sunlight_propagates = false;
// Check content nearly at camera position
{
v3s16 p = floatToInt(p0 /*+ dir * 3*BS*/, BS);
MapNode n = map->getNodeNoEx(p);
if(ndef->get(n).param_type == CPT_LIGHT &&
!ndef->get(n).sunlight_propagates)
allow_allowing_non_sunlight_propagates = true;
}
// If would start at CONTENT_IGNORE, start closer
{
v3s16 p = floatToInt(pf, BS);
MapNode n = map->getNodeNoEx(p);
if(n.getContent() == CONTENT_IGNORE){
float newd = 2*BS;
pf = p0 + dir * 2*newd;
distance = newd;
sunlight_min_d = 0;
}
}
for(int i=0; distance < end_distance; i++){
pf += dir * step;
distance += step;
step *= step_multiplier;
v3s16 p = floatToInt(pf, BS);
MapNode n = map->getNodeNoEx(p);
if(allow_allowing_non_sunlight_propagates && i == 0 &&
ndef->get(n).param_type == CPT_LIGHT &&
!ndef->get(n).sunlight_propagates){
allow_non_sunlight_propagates = true;
}
if(ndef->get(n).param_type != CPT_LIGHT ||
(!ndef->get(n).sunlight_propagates &&
!allow_non_sunlight_propagates)){
nonlight_seen = true;
noncount++;
if(noncount >= 4)
break;
continue;
}
if(distance >= sunlight_min_d && *sunlight_seen == false
&& nonlight_seen == false)
if(n.getLight(LIGHTBANK_DAY, ndef) == LIGHT_SUN)
*sunlight_seen = true;
noncount = 0;
brightness_sum += decode_light(n.getLightBlend(daylight_factor, ndef));
brightness_count++;
}
*result = 0;
if(brightness_count == 0)
return false;
*result = brightness_sum / brightness_count;
/*std::cerr<<"Sampled "<<brightness_count<<" points; result="
<<(*result)<<std::endl;*/
return true;
}
int ClientMap::getBackgroundBrightness(float max_d, u32 daylight_factor,
int oldvalue, bool *sunlight_seen_result)
{
const bool debugprint = false;
INodeDefManager *ndef = m_gamedef->ndef();
static v3f z_directions[50] = {
v3f(-100, 0, 0)
};
static f32 z_offsets[sizeof(z_directions)/sizeof(*z_directions)] = {
-1000,
};
if(z_directions[0].X < -99){
for(u32 i=0; i<sizeof(z_directions)/sizeof(*z_directions); i++){
z_directions[i] = v3f(
0.01 * myrand_range(-100, 100),
1.0,
0.01 * myrand_range(-100, 100)
);
z_offsets[i] = 0.01 * myrand_range(0,100);
}
}
if(debugprint)
std::cerr<<"In goes "<<PP(m_camera_direction)<<", out comes ";
int sunlight_seen_count = 0;
float sunlight_min_d = max_d*0.8;
if(sunlight_min_d > 35*BS)
sunlight_min_d = 35*BS;
std::vector<int> values;
for(u32 i=0; i<sizeof(z_directions)/sizeof(*z_directions); i++){
v3f z_dir = z_directions[i];
z_dir.normalize();
core::CMatrix4<f32> a;
a.buildRotateFromTo(v3f(0,1,0), z_dir);
v3f dir = m_camera_direction;
a.rotateVect(dir);
int br = 0;
float step = BS*1.5;
if(max_d > 35*BS)
step = max_d / 35 * 1.5;
float off = step * z_offsets[i];
bool sunlight_seen_now = false;
bool ok = getVisibleBrightness(this, m_camera_position, dir,
step, 1.0, max_d*0.6+off, max_d, ndef, daylight_factor,
sunlight_min_d,
&br, &sunlight_seen_now);
if(sunlight_seen_now)
sunlight_seen_count++;
if(!ok)
continue;
values.push_back(br);
// Don't try too much if being in the sun is clear
if(sunlight_seen_count >= 20)
break;
}
int brightness_sum = 0;
int brightness_count = 0;
std::sort(values.begin(), values.end());
u32 num_values_to_use = values.size();
if(num_values_to_use >= 10)
num_values_to_use -= num_values_to_use/2;
else if(num_values_to_use >= 7)
num_values_to_use -= num_values_to_use/3;
u32 first_value_i = (values.size() - num_values_to_use) / 2;
if(debugprint){
for(u32 i=0; i < first_value_i; i++)
std::cerr<<values[i]<<" ";
std::cerr<<"[";
}
for(u32 i=first_value_i; i < first_value_i+num_values_to_use; i++){
if(debugprint)
std::cerr<<values[i]<<" ";
brightness_sum += values[i];
brightness_count++;
}
if(debugprint){
std::cerr<<"]";
for(u32 i=first_value_i+num_values_to_use; i < values.size(); i++)
std::cerr<<values[i]<<" ";
}
int ret = 0;
if(brightness_count == 0){
MapNode n = getNodeNoEx(floatToInt(m_camera_position, BS));
if(ndef->get(n).param_type == CPT_LIGHT){
ret = decode_light(n.getLightBlend(daylight_factor, ndef));
} else {
ret = oldvalue;
//ret = blend_light(255, 0, daylight_factor);
}
} else {
/*float pre = (float)brightness_sum / (float)brightness_count;
float tmp = pre;
const float d = 0.2;
pre *= 1.0 + d*2;
pre -= tmp * d;
int preint = pre;
ret = MYMAX(0, MYMIN(255, preint));*/
ret = brightness_sum / brightness_count;
}
if(debugprint)
std::cerr<<"Result: "<<ret<<" sunlight_seen_count="
<<sunlight_seen_count<<std::endl;
*sunlight_seen_result = (sunlight_seen_count > 0);
return ret;
}
void ClientMap::renderPostFx()
{
INodeDefManager *nodemgr = m_gamedef->ndef();
// Sadly ISceneManager has no "post effects" render pass, in that case we
// could just register for that and handle it in renderMap().
m_camera_mutex.Lock();
v3f camera_position = m_camera_position;
m_camera_mutex.Unlock();
MapNode n = getNodeNoEx(floatToInt(camera_position, BS));
// - If the player is in a solid node, make everything black.
// - If the player is in liquid, draw a semi-transparent overlay.
const ContentFeatures& features = nodemgr->get(n);
video::SColor post_effect_color = features.post_effect_color;
if(features.solidness == 2 && !(g_settings->getBool("noclip") && m_gamedef->checkLocalPrivilege("noclip")))
{
post_effect_color = video::SColor(255, 0, 0, 0);
}
if (post_effect_color.getAlpha() != 0)
{
// Draw a full-screen rectangle
video::IVideoDriver* driver = SceneManager->getVideoDriver();
v2u32 ss = driver->getScreenSize();
core::rect<s32> rect(0,0, ss.X, ss.Y);
driver->draw2DRectangle(post_effect_color, rect);
}
}
void ClientMap::PrintInfo(std::ostream &out)
{
out<<"ClientMap: ";
}
|