Compare commits

..

900 Commits

Author SHA1 Message Date
Nuno Gonçalves (Ulukyn) 7df9b2f255 Merge branch '58-add-rotz-roty-and-dist-reflect-lua-to-3dcamera-of-a-scene' into 'main/gingo-test'
Resolve "Add rotz roty and dist reflect lua to 3DCamera of a scene"

See merge request ryzom/ryzom-core!48
3 years ago
Nuno Gonçalves (Ulukyn) 8697553956 Resolve "Add rotz roty and dist reflect lua to 3DCamera of a scene" 3 years ago
nimetu d2508c8b15 Update hunter to 0.23.321 3 years ago
Nuno Gonçalves (Ulukyn) d385dedabc Merge branch '56-message-bubble-is-very-high-on-fh-alarm-plants' into 'main/gingo-test'
Resolve "Message bubble is very high on FH alarm plants"

See merge request ryzom/ryzom-core!45
3 years ago
Nuno Gonçalves (Ulukyn) ae33eb99bf Resolve "Message bubble is very high on FH alarm plants" 3 years ago
Nuno Gonçalves (Ulukyn) 2b88fd66ba Merge branch '46-rework-item-buff-icon-placement' into 'main/gingo-test'
Hide 1x quantity for equipable items, dynamic buff icon placement

See merge request ryzom/ryzom-core!43
3 years ago
Ben Saine be5bfd992c Hide 1x quantity for equipable items, dynamic buff icon placement 3 years ago
Nuno Gonçalves (Ulukyn) 9a24e7557f Merge branch '54-improve-the-way-to-reskin-ryzhome-items-and-preview' into 'main/gingo-test'
Resolve "Improve the way to reskin ryzhome items and preview"

See merge request ryzom/ryzom-core!44
3 years ago
Nuno Gonçalves (Ulukyn) 8708fd74c6 Resolve "Improve the way to reskin ryzhome items and preview" 3 years ago
Nuno db86219eab Added NL_NO_ASSERT to remove asserts in server 3 years ago
Nuno Gonçalves (Ulukyn) c6ec8a8d7d Merge branch '40-dragging-from-player-trade-to-inventory-takes-two-tries' into 'main/gingo-test'
Resolve "Dragging from player trade to inventory takes two tries"

See merge request ryzom/ryzom-core!39
3 years ago
Ben Saine 357934fcde Resolve "Dragging from player trade to inventory takes two tries" 3 years ago
Nuno Gonçalves (Ulukyn) e784c3aab1 Merge branch '37-remove-open-menu-option-from-scroll-items-when-item-use-a-scroll-label' into 'main/gingo-test'
Resolve "Remove Open menu option from scroll items when item use a Scroll.Label"

See merge request ryzom/ryzom-core!37
3 years ago
Nuno Gonçalves (Ulukyn) 22b4c074e8 Resolve "Remove Open menu option from scroll items when item use a Scroll.Label" 3 years ago
Nuno Gonçalves (Ulukyn) 255257a7f5 Merge branch '36-add-ability-to-have-translated-titles-with-untraslated-fields' into 'main/gingo-test'
Resolve "Add ability to have translated titles with untraslated fields"

See merge request ryzom/ryzom-core!36
3 years ago
Nuno Gonçalves (Ulukyn) 855410f3d0 Resolve "Add ability to have translated titles with untraslated fields" 3 years ago
Nuno Gonçalves (Ulukyn) 71a2c6f6e8 Merge branch '35-allow-drag-and-drop-between-zig-and-guild' into 'main/gingo-test'
Resolve "Allow drag and drop between zig and guild"

See merge request ryzom/ryzom-core!35
3 years ago
Ben Saine 3b2553e3dd Resolve "Allow drag and drop between zig and guild" 3 years ago
Nuno Gonçalves (Ulukyn) 54c7e09a10 Merge branch '21-fix-nopatch-without-argument-crash' into 'main/gingo-test'
Fix crash when --nopatch is used without argument

See merge request ryzom/ryzom-core!29
3 years ago
Meelis Mägi aebab35cad Fix crash when --nopatch is used without argument 3 years ago
Nuno Gonçalves (Ulukyn) 7cb6d4287e Merge branch '27-fixed-crash-with-html-image-downloads' into 'main/gingo-test'
Fixed cleanup of html downloads

See merge request ryzom/ryzom-core!25
3 years ago
Meelis Mägi 663de25cbe Fixed cleanup of html downloads 3 years ago
Nuno a7811f553e Merge branch '16-drag-drop-to-player-trade-window-from-all-inventories' into main/gingo-test 3 years ago
Nuno 743bf7f601 Merge remote-tracking branch 'origin/main/atys-live' into main/gingo-test 3 years ago
Nuno Gonçalves (Ulukyn) e891dddd1e Merge branch 'fix-area-effect-flying-text' into 'main/gingo-test'
Fix flying text for area magic/combat actions

See merge request ryzom/ryzom-core!19
3 years ago
Meelis Mägi e185ddc19f Fix flying text for area magic/combat actions 3 years ago
Nuno Gonçalves (Ulukyn) b12c7ac25c Merge branch 'add-screenshot-dir-to-config' into 'main/gingo-test'
Add ScreenShotDirectory entry to client.cfg

See merge request ryzom/ryzom-core!16
3 years ago
Meelis Mägi 9cff221a1e Add ScreenShotDirectory entry to client.cfg 3 years ago
Nuno Gonçalves (Ulukyn) 219bf0e066 Merge branch 'fix-viewtext-localized-text' into 'main/gingo-test'
Fix CViewText always returning localization key

See merge request ryzom/ryzom-core!34
3 years ago
Meelis Mägi c012e7ffcf Fix CViewText always returning localization key 3 years ago
Ben Saine 82b724fe88 Resolve "Encoding issues in client beta (after core4 merge)" 3 years ago
Nuno Gonçalves (Ulukyn) 9f2d2e7dda Merge branch '26-encoding-issues-in-client-beta-after-core4-merge' into 'main/gingo-test'
Resolve "Encoding issues in client beta (after core4 merge)"

See merge request ryzom/ryzom-core!33
3 years ago
Ben Saine 5df8ec43a0 Resolve "Encoding issues in client beta (after core4 merge)" 3 years ago
Nimetu 7c82f26bac Fix CViewText always returning localization key 3 years ago
Nimetu 3521d2d02e Fix macOS build, missing include 3 years ago
Nuno 88280ef02f Merge remote-tracking branch 'origin/main/atys-live' into main/atys-live 3 years ago
Nimetu 7344c98e6e Add macOS to azure pipeline 3 years ago
Nimetu 005e714f7d Add macOS to azure pipeline 3 years ago
Nimetu 37abc25dcb Add ubuntu-18.04 hunter image to azure pipeline 3 years ago
kaetemi ec41ba753f Download with aria2 instead and enable the DX drivers 3 years ago
kaetemi 63b4ea547a Download and extract DX SDK 3 years ago
Nimetu c31747a939 Add windows-2019 to azure pipeline 3 years ago
Nimetu 8aa1aed3bd Use Windows SDK if DirectX SDK not installed 3 years ago
Nimetu 19c5b582bc Fix linking with static OpenAL under windows 3 years ago
Nuno 993d749dba Use Hunter package manager to compile external libraries 3 years ago
Nimetu f6ac9bc4c1 Fix moving fullscreen window between monitors 3 years ago
Nuno Gonçalves (Ulukyn) 9e3064871a Merge branch 'fix-fullscreen-window-move' into 'main/gingo-test'
Fix moving fullscreen window between monitors

See merge request ryzom/ryzom-core!32
3 years ago
Nimetu 36e83e32f4 Fix moving fullscreen window between monitors 3 years ago
Nuno 0df3879358 Reapply changes reverted into atys-live because bad merge 3 years ago
Nuno b7e5ac18e9 Merge branch 'main/atys-live' into main/gingo-test 3 years ago
Nuno Gonçalves (Ulukyn) 80623a20cc Merge branch '31-wrong-fullscreen-resolution-in-opengl-win' into 'main/gingo-test'
Fix initial fullscreen window on OpenGL/Windows

See merge request ryzom/ryzom-core!31
3 years ago
Nuno Gonçalves (Ulukyn) efbceec12e Merge branch '31-wrong-fullscreen-resolution-in-opengl-win' into 'main/gingo-test'
Fix initial fullscreen window on OpenGL/Windows

See merge request ryzom/ryzom-core!31
3 years ago
Nimetu 013aad73d2 Fix initial fullscreen window on OpenGL/Windows 3 years ago
Nuno de638dfe6c Remove fmod option 3 years ago
Nuno 177e2395a5 Revert "Merge branch '32-remove-fmod-option-not-used-or-client-crash' into main/atys-live"
This reverts commit 0e2ec103ab.
3 years ago
Nuno 0e2ec103ab Merge branch '32-remove-fmod-option-not-used-or-client-crash' into main/atys-live 3 years ago
Nuno 574efe0c36 Remove fmod option 3 years ago
Nuno e43515e88a Fix generate_module_interface.xslt used to server shard_unifier_service/nel_database_mapping.xml file 3 years ago
Nuno 41794a1122 Merge branch 'main/atys-pre-live' into main/atys-live 3 years ago
Nimetu c47db9bf94 Fix utf8 encoding on sphrase info window 3 years ago
Nimetu b325126b20 Fixed cleanup of html downloads 3 years ago
Nuno 35a7a6628b Adde default value to _HeadPitch. Change bounds 3 years ago
Nimetu aa34e88101 Fix crash when --nopatch is used without argument 3 years ago
Nuno b667ccb6b6 Merge branch 'fixes' into main/atys-pre-live 3 years ago
Nuno Gonçalves (Ulukyn) 568d8ab895 Merge branch '28-add-command-to-switch-small-full-map' into 'main/gingo-test'
Resolve "Add command to switch small/full map"

See merge request ryzom/ryzom-core!26
3 years ago
Nuno Gonçalves (Ulukyn) 7f01b21d11 Merge branch '29-fix-camera-vertical-rotation-prevent-see-under-the-char' into 'main/gingo-test'
Resolve "Fix camera vertical rotation (prevent see under the char)"

See merge request ryzom/ryzom-core!27
3 years ago
Nuno Gonçalves (Ulukyn) d436d5616a Merge branch 'modify-item-buff-icons' into 'main/gingo-test'
Fix item buff icon overlapping with quantity

See merge request ryzom/ryzom-core!22
3 years ago
Nuno Gonçalves (Ulukyn) 973e183f2e Merge branch 'add-craftplan-buffs-to-craft-interface' into 'main/gingo-test'
Add craftplan buffs to crafting interface

See merge request ryzom/ryzom-core!23
3 years ago
Nuno 5c56c87d09 Adde default value to _HeadPitch. Change bounds 3 years ago
Nuno c616010246 Remove nlerror in getCurrentWindowUnder (useless)
Add debug when lua error
3 years ago
Nuno 700a9aadb7 Add command to switch small/full map 3 years ago
Nuno Gonçalves (Ulukyn) a246f3e5d0 Merge branch '26-encoding-issues-in-client-beta-after-core4-merge' into 'main/gingo-test'
Resolve "Encoding issues in client beta (after core4 merge)"

See merge request ryzom/ryzom-core!24
3 years ago
Meelis Mägi bbc291b9d3 Resolve "Encoding issues in client beta (after core4 merge)" 3 years ago
Nuno Gonçalves (Ulukyn) a64981a92a Merge branch '25-remove-lock-option-from-item-menu-in-guild-inventory' into 'main/gingo-test'
Resolve "Remove lock option from item menu in guild inventory"

See merge request ryzom/ryzom-core!21
3 years ago
Nuno Gonçalves (Ulukyn) 17c9dd061a Resolve "Remove lock option from item menu in guild inventory" 3 years ago
Ben Saine b72a71e87c Revert "add: sorting (initial draft)"
This reverts commit b4ce38099f
3 years ago
bensaine b4ce38099f add: sorting (initial draft) 3 years ago
Nimetu 9eaf7d3550 Add craftplan buffs to crafting interface 3 years ago
Nimetu 26827d2c66 Fix item buff icon overlapping with quantity 3 years ago
Nuno Gonçalves (Ulukyn) b6781af51e Merge branch 'inventory-fixes' into 'main/gingo-test'
Inventory fixes

See merge request ryzom/ryzom-core!12
3 years ago
Nuno Gonçalves (Ulukyn) e1b611f219 Inventory fixes 3 years ago
Nuno Gonçalves (Ulukyn) 8d7932a271 Merge branch 'self-kill' into 'main/gingo-test'
Merge selfkill

See merge request ryzom/ryzom-core!13
3 years ago
Nuno Gonçalves (Ulukyn) 0cc7a35dad Merge selfkill 3 years ago
Nuno 2304445c39 Remove bad commit (core4 path will be used in a next merge) 3 years ago
Ulu Kyn 701d7309e5 Revert "Merge ryzom-data into ryzom-core"
This reverts commit f3d0c9dc5b.
3 years ago
Ulu Kyn f3d0c9dc5b Merge ryzom-data into ryzom-core 3 years ago
Ulu Kyn a71f022c1a Merge ryzom-data into ryzom-core 3 years ago
Nuno cc3d42737e Merge branch 'fixes' into main/gingo-test 3 years ago
Nuno 1e590f1a69 Remove CPath::memoryCompress() because break CPath::lockup() 3 years ago
Nuno f450b57be0 Merge branch '6-resolve-show-lock-status-of-items-in-room-and-guild' into main/yubo-dev 3 years ago
Nuno fbb343ad51 Added resal_flag to databases 3 years ago
bensaine e1527b724b fix: typo 3 years ago
bensaine c3a633ae50 add: srcInvIndex 3 years ago
Nuno a76e8e1a64 Merge branch 'fixes' into main/gingo-test 3 years ago
Nuno 2df441225c Add RYZOM_PRODUCT_VERSION 3 years ago
Nuno 56cbc51005 Merge branch 'fixes' into main/gingo-test 3 years ago
Nuno 7ce53abffe Missing serialization (client can't load the icfg) 3 years ago
Nuno 4c4028822e Missing serialization (client can't load the icfg) 3 years ago
Nuno b4323b6515 Missing serialization (client can't load the icfg) 3 years ago
Nuno 9923062417 Merge branch 'main/gingo-test' into fixes 3 years ago
Nuno 8f74ba7851 Merge branch 'feature/develop-atys' into main/gingo-test 3 years ago
Nuno d6f367b2ba Merge remote-tracking branch 'origin/2-rework-player-trade-window' into main/yubo-dev 3 years ago
Nuno 3f5c3c5d98 Merge remote-tracking branch 'origin/2-rework-player-trade-window' into main/yubo-dev 3 years ago
Nuno 514f4613a8 Remove CPath::memoryCompress() because break CPath::lockup() 3 years ago
Ben Saine 24b0c99034 add: change slot # 3 years ago
Nuno 3dc2aa1bb6 Merge remote-tracking branch 'origin/self-kill' into main/yubo-dev 3 years ago
Nuno 543be4bc4c Merge branch 'translations' 3 years ago
Nuno 80007bc602 Merge branch 'translations' into yubo 3 years ago
Nuno cf9855a6d5 Merge branch 'fixes' into yubo 3 years ago
Nuno bec18c661d Merge branch 'fixes' 3 years ago
Nimetu 13eef096b4 Merge branch 'develop' into develop-atys 3 years ago
Nimetu d8deff3f23 Linux multi-monitor fullscreen support 3 years ago
Nimetu 2efc16ce52 Use configured resolution for login/outgame/ingame 3 years ago
Nimetu 5064f0417b Fix UI restore when window is resized while in loading screen 3 years ago
Nimetu d893d15daf Remove loading certs from native Windows cert store. 3 years ago
kaetemi 82ef7e5e81 Fix for MySQL 8 client lib support 3 years ago
kaetemi 8f839dc9c7 Properly follow StartupVerify setting 3 years ago
kaetemi 5fcaafbc60 Show more useful error on login failure 3 years ago
kaetemi 6d60cfee71 Stop sound when patching sound bnp 3 years ago
kaetemi 3076b62063 Fix build when using ValyriaTear/luabind (on Ubuntu) 3 years ago
kaetemi 3d208e024d Improve c++0x check 3 years ago
kaetemi af16f09d52 Ubuntu 16.04 is EOL 3 years ago
kaetemi b9d4aa2abd Add Ubuntu 20.04 target to Azure Pipelines configuration 3 years ago
Nimetu 759ece01d0 Merge branch 'atys' into develop-atys 3 years ago
Nuno 4a06fe15dd Merge branch 'master' into fixes 3 years ago
Nuno 575d5d9957 Merge branch 'fixes' into atys 3 years ago
Nuno 0d68ca05e2 Revert xml_macros 3 years ago
Nuno 6091e76516 Merge branch 'atys' into fixes 3 years ago
Nuno 0fbbf10361 Merge branch 'fixes' into atys 3 years ago
Nuno 557f5d3d6c Changes made after code-to-root-atys branch 3 years ago
Nuno d7d1bc60c2 Changes from Core 3 years ago
Nuno 3709ea4520 Revert All core changes (to be reapplied on next commit) 3 years ago
Nuno 70286d36a9 Remove unwanted files 3 years ago
Ulu Kyn 92ff9f12b0 Move to root 3 years ago
Nimetu 8cbb306db8 Remove loading certs from native Windows cert store. 3 years ago
Nuno 36c2ff5b86 Remove files in code 3 years ago
Nuno 1a49c4cd0b Merge branch 'atys' into fixes 3 years ago
Ben Saine 111d4a7a0a self kill command 3 years ago
bensaine 6cfc9585f5 Update .gitignore 3 years ago
Nimetu f76ad7a3eb Remove loading certs from native Windows cert store. 3 years ago
Nimetu ce0d1234cc Add missing WITH_FFMPEG option 3 years ago
Nuno Gonçalves (Ulukyn) 5d91c33ddd Merge branch 'master' into translations 3 years ago
Nimetu 78478e32cd Merge branch 'develop' into develop-atys 3 years ago
Nimetu ea6e4d91c3 Html special chars for title/textarea tags should remain decoded 3 years ago
Nimetu d388ff78ec Merge branch 'develop' into develop-atys 3 years ago
Nimetu 0b503e352b Fix htmlEscape function from deadlocking 3 years ago
Nimetu df4833bf0f Update gitignore 3 years ago
Nuno Gonçalves (Ulukyn) 8ef89b80b0 Fix resell issue (use uint16 instead of uint8 for Index) 3 years ago
Nuno Gonçalves (Ulukyn) bdea7d24d2 Fix resell issue (use uint16 instead of uint8 for Index) 3 years ago
Nuno Gonçalves (Ulukyn) 90161cd121 Fix resell issue (use uint16 instead of uint8 for Index) 3 years ago
Nuno Gonçalves (Ulukyn) 583a16d126 Merge remote-tracking branch 'origin/feature/develop-atys' into fixes 3 years ago
Nimetu 591ea6869e Remove shortcut to moveToAction().
sendExecuteToServer() will be called before clientExecute() and that
will cause "stuck stanza" client side when server rejects the action.
Reproducible with forage stanza with material specialization.
3 years ago
Nuno Gonçalves (Ulukyn) 01a2508567 Merge branch 'silan_refactoring' into yubo 3 years ago
Nuno Gonçalves (Ulukyn) b86b9283b2 Merge branch 'master' into silan_refactoring 3 years ago
Nimetu 0225beefa6 Merge branch 'develop' into develop-atys 3 years ago
Nimetu 0de1580520 Fix background overflow on items limited with maxw/maxh 3 years ago
Nimetu d9dd9863b7 Merge branch 'develop' into develop-atys 3 years ago
Ulukyn 7bed39665e Updated visual_slot.tab 3 years ago
Nimetu 9ecda65791 Fix table td background color inheriting from row 3 years ago
Nimetu fc6ecc7dbd Fix html,body background not using container opacity 3 years ago
Nimetu 5c53148907 Fix downloaded background images not showing 3 years ago
Nimetu 028f6cdd3e Add -ryzom-modulate-text-color to separate text from background, ryzom/ryzomcore#644 3 years ago
Nuno 6a1ea5ff59 Merge branch 'master' into yubo 3 years ago
Nuno Gonçalves (Ulukyn) 72ccfc9a02 Update from core4 branch 3 years ago
Ulukyn 0e2a14c822 Updated visual_slot.tab 3 years ago
Nimetu a4248d5fa1 Merge branch 'atys' into develop-atys 3 years ago
Nimetu 984b2b3590 Merge branch 'develop' into develop-atys 3 years ago
Nimetu 3f3991816b Fix missing css length type 3 years ago
Nimetu e0d54f7897 Draw table background/border using css renderers 3 years ago
Nimetu 37eec8cd7f Dotted/dashed border styles 3 years ago
Nimetu 2046c4bf6e Draw browser background with CSSBackgroundRenderer 3 years ago
Nimetu 12c515c264 Parse background style into own class 3 years ago
Nimetu 285cfb163f Fix possible deadlock in css content attribute 3 years ago
Nimetu a40ddf7955 Methods to preallocate texture id and swap texture for existing id 3 years ago
Nimetu dff191a7c2 Move loading texture from file/memory into own functions 3 years ago
Nimetu f26dc534c8 Split CDataDownload into subclasses 3 years ago
Nimetu dfe45029ab Add CSSLength, CSSBackground, CSSBackgroundRenderer classes 3 years ago
Nimetu 65edd9f95d Draw double/groove/ridge border styles 3 years ago
Nuno 4331e35227 Added build scripts for windows client and 3dsmax plugin 3 years ago
Nuno Gonçalves (Ulukyn) ce5817721a Merge branch 'fixes' into atys 3 years ago
Nuno Gonçalves (Ulukyn) aae899b65a Fix string to ucstring 3 years ago
Nimetu 487f9f060e Fix css rule declaration splitting 3 years ago
Nimetu 2e816ddf6e Add "transparent" to html color list 3 years ago
Nimetu 5d4a04169b Update getCssLength for new types, enable reading negative values. 3 years ago
Nimetu b2ec03d1a1 Fix background shorthand for -position and -clip 3 years ago
Nimetu 234465387b Fix getCssLength returning false for '0' 3 years ago
Nimetu 2133f6d2b7 Fixed bad type for _RenderLayer 3 years ago
Nimetu 63f1fb73dd Fix table background color and image draw order 3 years ago
Nimetu a040f7a2a8 CSS background color should not inherit its value 3 years ago
Nimetu 565932c18d Expand css margin shorthand 3 years ago
Nimetu cade609a3a Fix textarea not preserving linebreaks, keep tab char 3 years ago
Nimetu 093702a704 Fix web link in item customtext being visible 3 years ago
Nuno Gonçalves (Ulukyn) 4c66865de7 Merge branch 'fixes' into atys 3 years ago
Nimetu c00a9be398 Fix web link in item customtext being visible 3 years ago
Nuno Gonçalves (Ulukyn) 458861951b Merge branch 'fixes' into atys 3 years ago
Nuno Gonçalves (Ulukyn) 3f991d3781 Remove useless nlassert, just skip 3 years ago
Nuno Gonçalves (Ulukyn) 8d5c0facf8 Merge branch 'fixes' into atys 3 years ago
Nuno Gonçalves (Ulukyn) 178a22d961 Skip auto-select of char when player is reselecting char 3 years ago
Nuno Gonçalves (Ulukyn) f9dafe720c Merge branch 'rewards' 3 years ago
Nuno Gonçalves (Ulukyn) 72691a3379 Merge branch 'rewards' into yubo 3 years ago
Nuno Gonçalves (Ulukyn) bc991c8146 Merge branch 'master' into rewards 3 years ago
Riasan 62a821bc1d Changed: modify atys account urls 3 years ago
Riasan 103179ece7 Changed: modify account urls on client_default_cfg , allow read account manage url from client_default_cfg 3 years ago
Nimetu 19d0162332 Fix possible crash from unset variable 3 years ago
Nimetu 5bf139f690 Fix css rule declaration splitting 3 years ago
Nimetu d0d38238a8 Fix crash on reading background shorthand with single value 3 years ago
Nimetu 95716b65ca Fix comparing x twice in Direct3d setupScissor 3 years ago
Nimetu 75f490d394 Fix comparing same variable twice in CRingAccess 3 years ago
Nuno 64bff20e03 Merge branch 'silan_refactoring' into yubo 4 years ago
Nuno 1eb651a946 Merge branch 'master' into silan_refactoring 4 years ago
Nuno 7da7d8cbbe Merge branch 'interface_textures' into yubo 4 years ago
Nuno 0ee26a6488 Merge branch 'master' into interface_textures 4 years ago
Nuno 9e404a5965 Merge branch 'deco_objects' into yubo 4 years ago
Nuno 97099768dc Merge branch 'master' into deco_objects 4 years ago
kaetemi 7d1661df42
Merge branch 'develop' into feature/develop-atys 4 years ago
kaetemi 19a0d929bb
Exclude commits from attribution 4 years ago
Nuno a443848924 Merge branch 'rewards' into yubo 4 years ago
Nuno ca0dc24aa0 Merge branch 'rewards' 4 years ago
Nuno 6d68e96dd4 Merge branch 'master' into rewards 4 years ago
kaetemi 6d4b58c281
Update GPL headers 4 years ago
kaetemi fcf97d93df
Merge remote-tracking branch 'ryzomcore/develop' into feature/develop-atys 4 years ago
kaetemi c5658cfe26
Merge remote-tracking branch 'ryzomcore/merge-into-atys' into feature/develop-atys 4 years ago
Nimetu bc0071ac57
Fix issue with single enchant icon on jewels not showing 4 years ago
kaetemi 37a729b5cc
Merge remote-tracking branch 'ryzomcore/atys' into feature/develop-atys
# Conflicts:
#	code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp
4 years ago
Nuno Gonçalves (Ulukyn) efc1883cca Move files to root 4 years ago
Nuno 83a021e1e6 Merge branch 'master' into translations 4 years ago
Nuno 431b1ea339 Merge branch 'atys' into atys-live 4 years ago
Nuno 6c3d6403b0 Merge branch 'atys' into merge-into-atys 4 years ago
Nuno 405974c9c0 Merge remote-tracking branch 'origin/fixes' into atys 4 years ago
Nuno cc5bd3ddae Merge branch 'interface_textures' into yubo 4 years ago
Nuno 5613eb855e Remove useless visual_slot.tab 4 years ago
Nimetu 5614028f63 Fix bad merge 4 years ago
Nimetu a28bda89e6 Fix issue with single enchant icon on jewels not showing 4 years ago
Nimetu b2d6c313db Merge branch 'develop' into develop-atys 4 years ago
Nuno 74c643f147 Merge branch 'ark' into yubo 4 years ago
Nuno 3d43c3c626 Merge branch 'ark' 4 years ago
Nimetu 78fa873003 Merge branch 'atys' into develop-atys 4 years ago
Nuno 6bd853f7bf Merge branch 'master' into ark 4 years ago
Nuno 49b4295765 Merge remote-tracking branch 'origin/fixes' into atys 4 years ago
Nimetu 3362afaa4d Fix mission give item window sometimes not appearing. 4 years ago
Nuno c5b34c927e Merge tag 'live/871' into atys-live 4 years ago
Nuno fa3eab3305 Merge branch 'storyline/s2e0' into atys 4 years ago
Nuno 7d1534fb31 Fix bad commit 4 years ago
Nuno 791eb639df Merge branch 'atys' into storyline/s2e0 4 years ago
Nuno 772990d421 Added missing check when get node 4 years ago
Nuno c8fd716f8a Added #include <sys/sysctl.h> for Mac 4 years ago
Nuno 72f7cbe4fa Merge branch 'rewards' into yubo 4 years ago
Nuno 9d2fc8c630 Merge branch 'rewards' 4 years ago
Nuno b4e54d5ad4 Merge branch 'master' into rewards 4 years ago
Nuno 904daebd88 Merge branch 'ryzom/ark/features' into atys 4 years ago
Nuno 9c996b5fe3 Added getTimestampHuman, isShiftDown and isCtrlDown.
Improved getMouseDown getMouseMiddleDown and getMouseRightDown
4 years ago
Nuno 7964a42927 Merge branch 'atys' into ryzom/ark/features 4 years ago
Nuno 24cb13d744 Merge branch 'feature/bonusmalus-timers' into atys 4 years ago
Nuno c8f4a85f0c Merge branch 'translation-settings-improvements' into atys 4 years ago
Nuno 7bd936ea24 Merge branch 'atys' into fixes 4 years ago
Nuno 4bcea9a70e Merge branch 'fixes' into atys 4 years ago
Nuno 762e3b603e -ryzom-modulate-bgcolor can be false 4 years ago
Nuno 292e142319 Merge branch 'fixes' into atys 4 years ago
Nuno cdb1786018 Remove useless #include <sys/sysctl.h> 4 years ago
Nimetu 1299484163 Fix uninitialized value 4 years ago
Nimetu 668e15e394 Add initial support for centered multiline text in table 4 years ago
Sit Melai cdf1bacee1 Added checks if the DB leafs aren't present 4 years ago
Nuno 1ec4f88471 Added check if node are null 4 years ago
Sit Melai 673ce18e72 Fix crash if bubble message isn't translated 4 years ago
Nuno 54fd022501 Merge branch 'silan_refactoring' into yubo 4 years ago
Nuno 5fe26ec6d6 Merge branch 'new_interface_features' 4 years ago
Nuno 40a9e782c3 Merge branch 'new_interface_features' into yubo 4 years ago
Nuno 155e268ece Merge branch 'master' into new_interface_features 4 years ago
Nuno 649527039b Merge branch 'ryzom/op_refactoring' into atys 4 years ago
Nuno d350b1621d Merge branch 'translations' 4 years ago
Nuno 22bab29654 Merge branch 'translations' into yubo 4 years ago
Nuno 5632fffa44 Merge branch 'me-translations' into translations 4 years ago
Nuno 1cc000cc6c Merge branch 'translations' into me-translations 4 years ago
Nuno e9b7345ba5 Update GvE outpost options 4 years ago
Nuno 6f4319bfcb Merge branch 'translations' into yubo 4 years ago
Nuno ab958d1891 Merge branch 'master' into translations 4 years ago
Nuno c3c7e15c81 Merge branch 'master' into new_interface_features 4 years ago
Nuno 568a7a10a9 Merge branch 'new_interface_features' 4 years ago
Nuno f886d5eac7 Merge branch 'new_interface_features' into yubo 4 years ago
Nuno 540ab1ffc8 Fixed issue with families 4 years ago
Nuno 629e8f5272 Added Gen and Mar OP mats 4 years ago
Nuno 868f462d5f Added Gen and Mar OP mats 4 years ago
Nuno 5a7d067a71 Added Gen and Mar OP mats 4 years ago
Nuno 17f818eace Added GvE option 4 years ago
Nuno 5825332757 Merge branch 'atys' into ryzom/op_refactoring 4 years ago
Nimetu c1170a0a4d Ignore last linebreak in pre tag 4 years ago
Nimetu 291d332b56 Fix css style order when using external css files 4 years ago
Nimetu d8f54820c4 Ignore first linebreak after pre, textarea open tag 4 years ago
Nimetu 155418b20b Fix temp file collision and image update on http/304 response 4 years ago
Nimetu d665e1fc45 Fix detecting jpg image 4 years ago
Nimetu 36f9888b91 Merge branch 'atys' into develop-atys 4 years ago
Nimetu 17782d5d21 Merge branch 'develop' into develop-atys 4 years ago
Nuno 85e788da81 Merge branch 'master' into new_interface_features 4 years ago
Nuno 54de87acf4 Merge branch 'fixes' into atys 4 years ago
Nuno ebab993e3e Merge branch 'ryzom/ui/improvements' into atys 4 years ago
Nuno 3613dfd305 Merge branch 'storyline/s2e0' into atys 4 years ago
Nuno c09f82db16 Added boost icons 4 years ago
Nuno 6402a31e4e Added boost allegories family 4 years ago
Nuno 27cdcf1e02 Merge branch 'atys' into storyline/s2e0 4 years ago
Nuno de90245f27 Added GvE and GvG to TPVPType enum 4 years ago
Nuno bf2f8e39a5 Added nopatch arg for use with Ryztart 4 years ago
Nimetu 26482eef1b Revert "Add missing PowerRoot effect families to sheetid conversions table."
This reverts commit ff9aa6c608.
4 years ago
Nimetu 383e362ed7 Show bonus/malus timer text if available 4 years ago
Nimetu c09ed63120 Add xml options for icon regen text 4 years ago
Nimetu fdb271bdb3 Add macros to read properties from xmlNode 4 years ago
kaetemi dba92deea5 Avoid useless string operations 4 years ago
Nuno 0fb9422426 Merge branch 'master' into translations 4 years ago
kaetemi 2528e542cb Don't probe if normal received in probe state, otherwise server will not enter probe state, ryzom/ryzomcore#622, ryzom/ryzomcore#133 4 years ago
kaetemi 719f178f70 Disconnect if UDP Login fails, ryzom/ryzomcore#622 4 years ago
Riasan f83d8a206e Merge branch 'atys' of gitlab.com:ryzom/ryzom-core into atys 4 years ago
Riasan 8cd863ff44 Added: new privs TESTER for teleport via Map / Command 4 years ago
Nuno 89065eee3f Merge branch 'me-translations' 4 years ago
Sit Melai 91b3ff25b4 Add disabling of translation per channel 4 years ago
Nimetu 4bcf9270eb Show reload link when curl fails to open connection to website 4 years ago
Sit Melai c75071b488 Handle hiding the flag and inversing translations for each language 4 years ago
Nimetu 04a5aa372b Merge branch 'develop' into develop-atys 4 years ago
Nimetu 29ef76e537 utf-8 fixes, ryzom/ryzomcore#335 4 years ago
Nimetu 040eee5c9e Merge branch 'atys' into develop-atys 4 years ago
Nimetu c6ede4a8b4 Merge branch 'develop' into develop-atys 4 years ago
Nuno adf9a646b7 Merge branch 'ryzom/ui/improvements' into atys 4 years ago
Nuno 2aaa928cdc Fixed potential security hole 4 years ago
Nuno 83d0e600f1 Merge branch 'ryzom/ui/improvements' into atys 4 years ago
Nuno df69a1706f Fixed potential security hole 4 years ago
Nuno 6651e839f3 Merge branch 'translations' into me-translations 4 years ago
Nuno 62be2ab1fb Merge branch 'stline/s2e1' 4 years ago
Nuno 8c62f4e64c Merge branch 'master' into stline/s2e1 4 years ago
Nuno 2075bf7443 Merge branch 'translations' 4 years ago
Nuno 44caf59afd Merge branch 'master' into translations 4 years ago
Nuno 057cf828f4 Merge branch 'translations' 4 years ago
Nuno 8d2071524c Merge branch 'master' into translations 4 years ago
Nuno 6db93a0ef0 Merge branch 'ryzom/ui/improvements' into atys 4 years ago
Nuno f61d10c75e Added executeRyzomScript, executeTutorial and processTutorialEvent lua callbacks 4 years ago
Nuno 90728f372a Merge branch 'feature/hires-textures' into atys 4 years ago
Nuno 8fa5de61e3 Merge branch 'fixes' into atys 4 years ago
Nuno 74dbe1e52c Merge branch 'ryzom/ui/improvements' into atys 4 years ago
Nuno 6adf44f0b0 Merge branch 'fx' into atys 4 years ago
Nuno 98124a3bd5 Merge branch 'deco_objects' 4 years ago
Nuno 46ecaac095 Merge branch 'master' into deco_objects 4 years ago
Nuno 06e2840be5 Merge branch 'new_interface_features' 4 years ago
Nuno bbabe75247 Merge branch 'master' into new_interface_features 4 years ago
Nuno b62ddc49d2 Merge branch 'interface_textures' 4 years ago
Nuno 690286b2c4 Merge branch 'master' into interface_textures 4 years ago
Nuno ada7dec7d3 Merge branch 'stline/s2e1' 4 years ago
Nuno 98b091ab63 Added TeleportMarauder 4 years ago
Nuno 53252d40db Merge branch 'new_interface_features' into yubo 4 years ago
Nuno 2b648934ea Merge branch 'master' into new_interface_features 4 years ago
Nuno 46c7b0309d Added icons to broadcast 4 years ago
Nuno 347ed4b2fb Merge remote-tracking branch 'origin/ryzom/ui/improvements' into ryzom/ui/improvements 4 years ago
Nuno b9d29d5cfe Merge branch 'atys' into ryzom/ui/improvements 4 years ago
Nuno ea212bcba2 Merge branch 'stline/s2e1' into yubo 4 years ago
Nuno 281ec4ba60 Merge branch 'master' into stline/s2e1 4 years ago
Nuno 951f000be4 Keep missions window open when player accept one of them 4 years ago
Nuno 4726e74dcd Added marauder to static fames 4 years ago
Nuno c5fffb9ff0 Merge branch 'atys' into fixes 4 years ago
Nuno ae9989dfe4 Updated default textures in client 4 years ago
Nuno d35ae0db80 Merge branch 'ark' into yubo 4 years ago
Nuno 3dbdbad80a Merge branch 'master' into ark 4 years ago
Riasan 0a81f40606 Fixed: Typo 4 years ago
Nuno c63b21150e Merge branch 'atys' into feature/hires-textures 4 years ago
Nuno 9771d79bc3 Fixed bad conversion in getPlayerVp*Hex and getTargetVp*Hex 4 years ago
Nimetu b70573d1dc Merge branch 'atys' into develop-atys 4 years ago
Nimetu 7111cf44b3 Merge branch 'develop' into develop-atys 4 years ago
Nimetu cb77552121 Remove file from bad merge 4 years ago
Nuno 2bf8faf29e Fixed bad check of args 4 years ago
Nuno b984e2e3d8 Missing definition of getSheetShape 4 years ago
Nuno 140c380eb5 Merge branch 'ryzom/ark/features' into atys 4 years ago
Nuno 1225fc0fe8 Added onover options for createArkPointButton in map 4 years ago
Nuno 13cb05c732 Merge branch 'atys' into ryzom/ark/features 4 years ago
Nuno f84184af25 Merge branch 'atys' into feature/hires-textures 4 years ago
Nuno 4b6e0184a3 Merge branch 'atys' into feature/develop-atys 4 years ago
Nuno 269526e87f Fixed bad check of args 4 years ago
Nuno b8668813df Merge branch 'interface_textures' into yubo 4 years ago
Nuno 6f9dce0fdc Merge branch 'master' into interface_textures 4 years ago
Nuno fd8b2436ff Merge branch 'master' into me-translations 4 years ago
Nuno 588bd79535 Merge branch 'translations' 4 years ago
Nuno ced0ca3e1c Merge branch 'translations' into yubo 4 years ago
kaetemi e998d3a85c Merge remote-tracking branch 'ryzomcore/atys' into feature/develop-atys 4 years ago
kaetemi 5c3b0cf14b Merge remote-tracking branch 'ryzomcore/develop' into feature/develop-atys 4 years ago
Nuno c327303222 Merge branch 'master' into translations 4 years ago
Nuno 864eba1629 Merge branch 'master' into me-translations 4 years ago
Nuno 29c3651063 Merge branch 'translations' 4 years ago
Nuno acfb37103f Merge branch 'translations' into yubo 4 years ago
Nuno 3d38a8ca89 Merge branch 'master' into translations 4 years ago
Nuno 4f34ce36ae Merge branch 'atys' into ryzom/ui/improvements 4 years ago
Nuno 8d2b26b738 Merge branch 'fixes' into atys 4 years ago
Nuno 79e65a6b9e Rollback bad commit 4 years ago
Nuno 6e59af8dc9 Merge remote-tracking branch 'origin/fixes' into fixes 4 years ago
Nuno d23166ae49 Fixed getTargetVpcHex and getTargetVpc 4 years ago
Nuno 0b110c6a88 Fixed getTargetVpcHex and getTargetVpc 4 years ago
Nuno 13398f094a Merge branch 'fixes' into atys 4 years ago
Nuno 7018a4439c Fixed getTargetVpcHex and getTargetVpc 4 years ago
Riasan cbbbc74a60 Changed: add lua function 4 years ago
Nuno dab6321caa Merge branch 'ark' 4 years ago
Nuno 07390fed37 Merge branch 'ark' into yubo 4 years ago
Nuno ec98cd2e65 Merge branch 'master' into ark 4 years ago
Nuno ad52a23437 Merge branch 'translations' 4 years ago
Nuno c78d1d934f Merge branch 'ark' into yubo 4 years ago
Nuno 677933ed98 Merge branch 'ark' 4 years ago
Nuno 541529bb3f Merge branch 'interface_textures' into yubo 4 years ago
Nuno a273f78851 Merge branch 'interface_textures' 4 years ago
Nuno cb207bdd9d Merge branch 'master' into interface_textures 4 years ago
Nuno 8ec332fefa Merge branch 'master' into ark 4 years ago
Nuno 2f776eab9c Merge branch 'master' into translations 4 years ago
Nuno 04aa097781 Merge branch 'master' into yubo 4 years ago
Nuno 3996327394 Merge branch 'translations' 4 years ago
Nuno 27e553ccb5 Merge branch 'master' into ark 4 years ago
Nuno 323be1612e Merge branch 'fixes' into atys 4 years ago
Nuno 184582cfc9 Removed uiBotChatPhrase 4 years ago
Nimetu e39cd0a8d3 Add --url, --app options for client patcher 4 years ago
Nuno 0b9599c57b Merge branch 'friend_list_groups_and_notes' into atys 4 years ago
Sit Melai 9d7f2af1a7 Fixed not correctly removing Group Containers when removing people (causing crash at char change) 4 years ago
Nuno e021c09051 Merge branch 'interface_textures' into yubo 4 years ago
Nuno 52ff736ee9 Merge remote-tracking branch 'origin/master' into interface_textures 4 years ago
Nuno d2c56f4b7c Merge branch 'rewards' 4 years ago
Nuno 2bdc6fb7ae Merge branch 'rewards' into yubo 4 years ago
Nuno a848eab99c Merge remote-tracking branch 'origin/master' into rewards 4 years ago
kaetemi b0f1c73d77 Merge remote-tracking branch 'ryzomcore/atys' into feature/develop-atys 4 years ago
kaetemi 109ed7eba5 Merge branch 'develop' into feature/develop-atys 4 years ago
Nuno 9ae2df4527 Merge remote-tracking branch 'origin/fixes' into atys 4 years ago
Nimetu 762962ef25 Fixed: Only download own platform exedll_.ref files 4 years ago
Nimetu 9f3250f4db Fixed: patching single file with multiple version in a row. 4 years ago
Nimetu e8c18b1b44 fix build 4 years ago
Nimetu 73610be10d utf-8 fixes, ryzom/ryzomcore#335 4 years ago
Nimetu 72098f624d fix merge conflict 4 years ago
kaetemi 1a6e5e6e2b Merge branch 'develop' into feature/develop-atys 4 years ago
kaetemi 7adbb84514 Merge branch 'develop' into feature/develop-atys 4 years ago
kaetemi e74e229ad9 Merge remote-tracking branch 'ryzomcore/atys' into feature/code-to-root-atys 4 years ago
Nimetu ae91cc4179 Fixed: Ingame map search and search result tooltips for UTF8 strings 4 years ago
Nimetu 6ccd8853db Fixed: setActive() did not invalidate table cell size. 4 years ago
Nuno cc7793202b Merge remote-tracking branch 'origin/feature/hires-textures' into atys 4 years ago
Nuno 0bb160545f Merge remote-tracking branch 'origin/ryzom/ui/improvements' into atys 4 years ago
Nuno 0e1b464e98 Merge remote-tracking branch 'origin/ryzom/patch-changes' into atys 4 years ago
Nuno dfe051a8df Merge remote-tracking branch 'origin/fixes' into atys 4 years ago
Nuno Gonçalves (Ulukyn) 2f6133c8ba Merge branch 'second-action-bar-editable' into 'atys'
Make the second action bar editable like main one

See merge request ryzom/ryzom-core!1
4 years ago
Nuno Gonçalves (Ulukyn) 95f8cefecc Merge branch 'translation-original-message-by-default-option' into 'atys'
Added option to show the translation as a tooltip

See merge request ryzom/ryzom-core!2
4 years ago
Nuno Gonçalves (Ulukyn) b98cd5e345 Merge branch 'move-group-with-zig' into 'atys'
Move item group from/to zig

See merge request ryzom/ryzom-core!3
4 years ago
Nuno Gonçalves (Ulukyn) bca2a28187 Merge branch 'friend_list_groups_and_notes' into 'atys'
Friend list groups

See merge request ryzom/ryzom-core!4
4 years ago
Sit Melai b7cbeeb2ae Fixed grayed icons on second bar not draggable 4 years ago
Ulukyn 5d4e81e24c Merge branch 'stline/s2e1' into yubo 4 years ago
Ulukyn c73fff2ca6 Merge branch 'master' into stline/s2e1 4 years ago
Nimetu 9532fc3a81 Fixed: mouse free look when using inverted mouse 4 years ago
Nimetu 6b59fc0081 Fixed: ctrl+3 detected as KeyESCAPE when using keychar event 4 years ago
Sit Melai 47bf9ecbc8 Always create General group, so at first launch groups show directly when changed 4 years ago
Sit Melai 02732c1241 Changes to fix compilation on some setups 4 years ago
Sit Melai f96f0b41b9 Removed an unused variable and don't show groups anymore when there is only one 4 years ago
Sit Melai 5dc85db8b1 Added action handlers to change contact group and read/write to file 4 years ago
Sit Melai 49fcec5759 First steps, still work in progress 4 years ago
Sit Melai b8b21914f6 Made item groups compatible with Zigs 4 years ago
Sit Melai bccc86bd99 Added option to show the translation as a tooltip and original by default 4 years ago
Sit Melai e5b3b752d5 Copyright somehow got lost 4 years ago
Sit Melai c06469b2a0 Fixed second action bar not updating after being changed 4 years ago
Ulukyn 6fa74cd5c2 Added: Option to use ryzom_client_patcher as bnp unpacker and xdelta patcher 5 years ago
Riasan 8cd685d1f4 Merge remote-tracking branch 'remotes/origin/ui-improvements' into yubo 5 years ago
Riasan f31eeff8fc Changed: add display current online guildmembers 5 years ago
Sit Melai 7e10c697eb Merge Atys 5 years ago
Nimetu f7be62eb3d Fixed: Player/guild room buy dialog price 5 years ago
Nimetu 2a4b16ab1b Changed: Allow to use 2x/4x hi-res texture atlas for GUI elements 5 years ago
Ulukyn f7e8e3f516 Merge branch 'fix_opengl_on_mac' into atys 5 years ago
Ulukyn 107dbc1987 Changed: Fixed non-Mac compilation 5 years ago
Ulukyn 97dc744759 Merge branch 'translations' into yubo 5 years ago
Ulukyn 012339dcf1 Merge branch 'translations' 5 years ago
Ulukyn 884c65fc26 Merge branch 'master' into translations 5 years ago
Ulukyn 07f9a55e48 Merge branch 'fixes' into atys 5 years ago
Ulukyn a87b0f4c97 Changed: When ryzom patch fails try to download lzma file (this last may never fail) 5 years ago
Ulukyn 4138a99fb7 Merge remote-tracking branch 'origin/translation-german-fixes' into yubo 5 years ago
Ulukyn 7be52a10fe Merge branch 'atys' into fixes 5 years ago
Ulukyn f4a104bf3f Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 80a6bf72a9 Changed: renamed creatures are now name in ucfirst 5 years ago
Ulukyn 17e539132b Added: very basic anti-spam system (prevent duplication of same message) 5 years ago
Ulukyn 27bd2cec01 Merge branch 'atys' into ryzom/ui/improvements 5 years ago
Ulukyn 6597f32fc1 Merge branch 'ryzom/deepl' into atys 5 years ago
Ulukyn 9e2872d15e Added: Add a language icon when client receive a translated message 5 years ago
Ulukyn 901f33d9a7 Merge branch 'storyline/s2e0' into atys 5 years ago
Ulukyn 421de3fa91 Changed: fixed issue with rumors 5 years ago
Ulukyn 08fb509d99 Merge branch 'atys' into storyline/s2e0 5 years ago
Sit Melai 6c8aeb6ae3 Missed a whitespace 5 years ago
Sit Melai 59c794f716 Wrongly removed previous change 5 years ago
Heernis 3c052d5fcc Merge branch 'master' into translation-german-fixes 5 years ago
Sit Melai c2e7807f99 Adapt action handler for editing phrases to handle second action bar 5 years ago
Riasan d130a7f826 Changed: fix client crash from opengl changes + fix compiling error because of moved client_default.cfg 5 years ago
Ulukyn fd2cc53d68 Merge remote-tracking branch 'origin/translation-german-fixes' into translations 5 years ago
Ulukyn 6ae34e08d9 Merge branch 'translations' into yubo 5 years ago
Ulukyn 80568ade1c Merge branch 'translations' 5 years ago
Ulukyn a8016b6a59 Merge branch 'master' into translations 5 years ago
Ulukyn d0fdfe175d Merge branch 'fixes' into yubo 5 years ago
Ulukyn 4254b6788a Fixed: Bad dispaly of server custom names 5 years ago
Riasan ada46dfabc Changed: update releasenote url 5 years ago
kaetemi fc197880a4 Merge remote-tracking branch 'ryzomcore/atys' into feature/code-to-root-atys 5 years ago
Ulukyn ada3c09a51 Merge branch 'master' into yubo 5 years ago
Ulukyn 83061f7f03 Merge remote-tracking branch 'origin/fix-media-player' into atys 5 years ago
Ulukyn 3c6bed32fd Merge remote-tracking branch 'origin/fix-media-player' into yubo 5 years ago
Nimetu 92b3a31f0b Fixed: Calling stop on music player should not affect background music. 5 years ago
Ulukyn f396858ea9 Merge branch 'ark' 5 years ago
Ulukyn eae8f9999d Merge branch 'stline/s2e1' 5 years ago
Ulukyn b8885cd661 Merge branch 'storyline/s2e1' into atys 5 years ago
Ulukyn f67a1cde32 Merge remote-tracking branch 'origin/ryzom/ui/improvements' into atys 5 years ago
Ulukyn feb1a5647d Merge remote-tracking branch 'origin/fix-media-player' into atys 5 years ago
Ulukyn f3009c4178 Merge branch 'master' into ark 5 years ago
Ulukyn 820bd23cf6 Merge branch 'ark' into origin/master 5 years ago
Ulukyn c883ea63e0 Merge branch 'ark' into yubo 5 years ago
Ulukyn 791a6641d9 Merge remote-tracking branch 'origin/master' into ark 5 years ago
Ulukyn 521a5c8fb7 Merge branch 'storyline/s2e1' into yubo 5 years ago
Ulukyn da876dcf7c Merge remote-tracking branch 'origin/ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 0069db15a6 Merge remote-tracking branch 'origin/fix-media-player' into yubo 5 years ago
Ulukyn 3da2f45363 Added: Remove ambiance ans shininess to SE shapes. Add seasons texture set 5 years ago
Ulukyn 1143ecaae0 Merge branch 'atys' into storyline/s2e1 5 years ago
Heernis bcc107e187 Merge remote-tracking branch 'origin/master' into translation-german-fixes 5 years ago
Nimetu 36187626a9 Fixed: Restore playlist after charselect 5 years ago
Nimetu bde8d008d1 Fixed: Crash on switching chars, logout 5 years ago
Nimetu 6993a2731f Changed: SHow no-files text if there is no songs in playlist 5 years ago
Nimetu 52d6f89e1e Fixed: Clear song info when all songs are done playing. 5 years ago
Nimetu 5bddfcfb22 Fixed: Audio decoder getMusicInfo/getSongTitle needs to be thread safe 5 years ago
Ulukyn aa15fd4e98 Merge branch 'stline/s2e1' into yubo 5 years ago
Ulukyn 0f8673beac Merge branch 'master' into stline/s2e1 5 years ago
Ulukyn 219914b4bf Merge branch 'master' into yubo 5 years ago
Ulukyn fb4aebf506 Merge branch 'rewards' 5 years ago
Ulukyn 81832ae0af Merge branch 'master' into rewards 5 years ago
kaetemi 39d6ca285a Merge remote-tracking branch 'origin/develop' into feature/code-to-root-atys 5 years ago
kaetemi c8fc110a9e Merge moving code directory to root for atys branch, ref #593 5 years ago
kaetemi a9fc9c2015 Merge branch 'feature/pre-code-move' into feature/code-to-root-atys 5 years ago
Ulukyn e32c852d96 Merge branch 'ui-improvements' into yubo 5 years ago
Ulukyn f3a02d4f2a Merge branch 'master' into yubo 5 years ago
Ulukyn bd99cd8aed Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 77d8cce15a Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn aa0d9d0be9 Changed: add border to pvp tags and display only if pvp 5 years ago
Ulukyn 0845e19408 Merge branch 'atys' into ryzom/ui/improvements 5 years ago
Ulukyn ece240448d Merge remote-tracking branch 'origin/merge-into-atys' into atys 5 years ago
Ulukyn 07ff703de2 Merge branch 'master' into ui-improvements 5 years ago
Ulukyn f6116a813b Merge branch 'ui-improvements' 5 years ago
Ulukyn 422a8bb744 Merge remote-tracking branch 'origin/merge-into-atys' into yubo 5 years ago
Ulukyn 25d4cca3a9 Merge branch 'atys' into yubo 5 years ago
Ulukyn 6a40fcf12d Fixed: miss of return statement 5 years ago
Ulukyn bf0042173f Merge branch 'ui-improvements' into yubo 5 years ago
Ulukyn 681568ce08 Merge branch 'master' into ui-improvements 5 years ago
Ulukyn 47863be96e Merge branch 'marauder' into yubo 5 years ago
Ulukyn ade5b6e702 Merge branch 'master' into marauder 5 years ago
Ulukyn ecd8b952a2 Merge branch 'atys' into yubo 5 years ago
Ulukyn 272f91210b Fixed: remove stupid hack for textures (finally...) 5 years ago
Ulukyn 24d4fb8253 Fixed: Prevent crash if no StartupVerify config 5 years ago
Nimetu 24fd5a6230 Fixed: Clear scene background if sky filter is used 5 years ago
Riasan 9043e78794 Merge remote-tracking branch 'remotes/origin/merge-into-atys' into yubo 5 years ago
Nimetu 5250d22706 Changed: Filter craft plans according to tool type. 5 years ago
Nimetu 682985978d Changed: Automatically build playlist on play if needed 5 years ago
Nimetu b3f8f307b0 Changed: Use worker thread to gather song title/duration. 5 years ago
Ulukyn b5ffa8becd Merge remote-tracking branch 'origin/merge-into-atys' into atys 5 years ago
Ulukyn 92090056ea Merge remote-tracking branch 'origin/merge-into-atys' into yubo 5 years ago
Nimetu a6c7b3dd37 Fixed: mp3 player keeps playing after clearing files from playlist 5 years ago
Ulukyn 1e54da83ef Merge remote-tracking branch 'origin/merge-into-atys' into yubo 5 years ago
Ulukyn 6ec06b29ab Merge branch 'atys' into yubo 5 years ago
Ulukyn 7b15da1018 Removed: client_default.cfg (moved to ryzom-data) 5 years ago
Nimetu 598be95efd Added: Ingame config options for window snap. 5 years ago
Nimetu 7f373a904e Fixed: Animal marker invalidates map on each frame 5 years ago
Nimetu 983475ff7c Fixed: Hide 'sound disabled' warning on startup 5 years ago
Ulukyn 44824414b1 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 95b0f63622 Fixed: hide RP-PVP tags if player are not tagged 5 years ago
Ulukyn 264b50a5ec Merge branch 'atys' into ryzom/ui/improvements 5 years ago
Ulukyn 143b96c214 Merge branch 'atys' into yubo 5 years ago
Ulukyn d4e5af7df2 Added: libicu in Makefile 5 years ago
Ulukyn 8dc9b89f94 Merge remote-tracking branch 'origin/merge-into-atys' into yubo 5 years ago
Nimetu 2d86c5377d Merge branch 'develop' into merge-into-atys 5 years ago
Ulukyn 04f9d593e0 Merge remote-tracking branch 'origin/merge-into-atys' into yubo 5 years ago
Nimetu 3be969a73d Merge branch 'develop' into merge-into-atys 5 years ago
Ulukyn ce8b05b284 Merge branch 'master' into stline/s2e1 5 years ago
Ulukyn 42b291c73e Merge remote-tracking branch 'origin/merge-into-atys' into yubo 5 years ago
Nimetu 4aa94b3ae9 Changed: Set WITH_RYZOM_LIVE=ON as default 5 years ago
Nimetu c0110133d7 Changed: Restore ryzom.com urls in client cfg 5 years ago
Nimetu c36faf2d61 Merge branch 'develop' into merge-into-atys 5 years ago
Ulukyn fef0cad61a Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn debb6b7d0c Changed: exposed the toggle_fly to final clients 5 years ago
Heernis f11ed5ea49 Merge remote-tracking branch 'origin/master' into translation-german-fixes 5 years ago
Ulukyn 050d9fea2f Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 9a8f29bb67 Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn c2e879ebcc Changed: removed pvp check for rp logos 5 years ago
Ulukyn 11086f9b44 Merge branch 'translations' into yubo 5 years ago
Ulukyn 311e739d98 Merge branch 'translations' 5 years ago
Ulukyn f6f7e553fc Merge branch 'master' into translations 5 years ago
Ulukyn 255271cde5 Merge branch 'translation-german-fixes' 5 years ago
Ulukyn 6d233cdc2c Merge branch 'translation-german-fixes' into yubo 5 years ago
Ulukyn f337a28ae2 Merge branch 'translations' into translation-german-fixes 5 years ago
Ulukyn a36694614f Merge branch 'master' into translation-german-fixes 5 years ago
Ulukyn bcb8080d42 Merge branch 'master' into translations 5 years ago
Ulukyn 2c9193fa74 Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 7e84ee9ec9 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn ff5d4e941c Merge branch 'atys' into ryzom/ui/improvements 5 years ago
Nimetu f853adfcba Changed: show/hide rp_logo_x icons depending if texture is set or not 5 years ago
Nimetu 1f736fc347 Fixed: Scroll bar losing position when group window is minimized 5 years ago
Ulukyn 8f3aaee987 Changed: new name of Enclyclopedia window 5 years ago
Ulukyn 8d0172e1fb Merge branch 'new_interface_features' into yubo 5 years ago
Ulukyn f06eebf26c Merge branch 'new_interface_features' 5 years ago
Ulukyn 31ecfdf181 Merge branch 'pact_interface' 5 years ago
Ulukyn 4997576923 Merge branch 'storyline/s2e1' into atys 5 years ago
Ulukyn 9b6693763f Merge branch 'ryzom/ark/features' into atys 5 years ago
Ulukyn b9d1cf26b7 Merge branch 'atys' into ryzom/ark/features 5 years ago
Ulukyn ae25e054d4 Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 269f8c4b2d Merge branch 'fix-menu-scroll' into atys 5 years ago
Ulukyn a3db3c6ba6 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Nimetu 4d9aa3e684 Changed: refactor 5 years ago
Nimetu e99b7e257d Fixed: Icon text must be in lowercase for bitmap icons 5 years ago
Nimetu 94873c3d3f Changed: Preserve icon text case as is 5 years ago
Nimetu 586e49282f Changed: Translate icon text if starts with uiit 5 years ago
Nimetu ca20d582b3 Changed: Remove char limit from displaying icon label 5 years ago
Nimetu 7cb5c817a6 Fixed: Switching continents ignored user landmark show/hide state 5 years ago
Nimetu ec1dfca0c5 Added: setUserLandMark command to show/hide user map markers 5 years ago
Ulukyn df6c0969c2 Merge branch 'master' into pact_interface 5 years ago
Ulukyn 590abe8bfd Merge branch 'master' into new_interface_features 5 years ago
Ulukyn b31fa09af7 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 3220a2aa47 Changed: new name of Enclyclopedia window 5 years ago
Ulukyn c639bb3c07 Merge remote-tracking branch 'origin/ryzom/ui/improvements' into yubo 5 years ago
Nimetu 2f635117f7 Changed: Require confirmation when removing landmark 5 years ago
Ulukyn 0cf26cbdf8 Merge branch 'fix-menu-scroll' into yubo 5 years ago
Nimetu 34083dee80 Changed: Adding icon to menu elements 5 years ago
Nimetu edb0c1fe73 Revert "Added: New way to add icons in Contextual Menus"
This reverts commit 188c3494fa.
5 years ago
Nimetu 9aabe0bf35 Revert "Fixed: Remove blank space when an item menu are inactive"
This reverts commit 10f864b234.
5 years ago
Nimetu 3b08d50b83 Fixed: Scroll bar losing position when group window is minimized 5 years ago
Ulukyn 523c07d9d9 Merge branch 'ryzom/ark/features' into atys 5 years ago
Ulukyn e89d3233dc Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 96e95c19ee Changed: Fix issue with webig dynChat 5 years ago
Ulukyn e10f79dbf2 Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 0aff3b4365 Revert "Changed: Fix issue with webig dynChat "
This reverts commit 14a375eea9f97cabb23199719cfa8022d9e907d1.
5 years ago
Ulukyn b0fa434c05 Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn e349cb4399 Fixed: issue with webig dyn chat 5 years ago
Ulukyn f9cf9db049 Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 92f3c01a74 Merge branch 'atys' into ryzom/ark/features 5 years ago
Ulukyn 3ffab7c1a1 Merge branch 'storyline/s2e1' into yubo 5 years ago
Ulukyn 4df2489f59 Changed: updated way to moveToTarget 5 years ago
Ulukyn de6418bb9a Merge branch 'storyline/s2e1' into yubo 5 years ago
Ulukyn 1db0300515 Added: moveToTarget lua command and OpenArkUrl move action 5 years ago
Ulukyn 435b4362d3 Merge branch 'atys' into yubo 5 years ago
Ulukyn f9d37a390a Fixed: Only get news from npcs 5 years ago
Ulukyn 99413cff48 Merge branch 'storyline/s2e0' into atys 5 years ago
Ulukyn d45f6efcef Merge branch 'storyline/s2e0' into yubo 5 years ago
Ulukyn 01cb2cfdd8 Fixed: check if crystallized spell have a root icon for background or add it 5 years ago
Ulukyn 5f762edac4 Merge branch 'storyline/s2e0' into atys 5 years ago
Ulukyn bfadcfaff5 Merge branch 'storyline/s2e0' into yubo 5 years ago
Ulukyn 55172c93b5 Merge branch 'atys' into storyline/s2e0 5 years ago
Ulukyn c950373782 Merge branch 'storyline/s2e0' into yubo 5 years ago
Ulukyn b1d18ddb53 Added: New familly brick BSGMC 5 years ago
Ulukyn b869cd07d6 Merge branch 'storyline/s2e0' into yubo 5 years ago
Ulukyn aaa24fd0f4 Merge branch 'storyline/s2e0' into atys 5 years ago
Ulukyn 6747613b03 Added: New familly brick BSGMC 5 years ago
Ulukyn ac6afb7b2f Merge branch 'stline/s2e0' 5 years ago
Ulukyn 4048ef29db Merge remote-tracking branch 'origin/webig-fixes' into atys 5 years ago
Ulukyn b5b395c127 Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn a7d2175f93 Merge remote-tracking branch 'origin/webig-fixes' into yubo 5 years ago
Ulukyn b16d132e1d Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn e3cef8803e Changed: Disable help phrase in a special case 5 years ago
Ulukyn cb2201a69a Merge branch 'master' into stline/s2e0 5 years ago
Nimetu dfeba1426a Fixed: Invalid table cell id 5 years ago
Ulukyn c9bec465bc Merge remote-tracking branch 'origin/webig-fixes' into yubo 5 years ago
Nimetu 7856e93723 Fixed: ah:html_submit_form without caller object 5 years ago
Nimetu 8f59a71e3c Fixed: html button with empty formid attribute 5 years ago
Nimetu 15433b263b Changed: Add proper ids to groups in webig 5 years ago
Ulukyn 58a731628b Merge remote-tracking branch 'origin/ryzom/sheets' into atys 5 years ago
Ulukyn eb8daeb652 Merge remote-tracking branch 'origin/ryzom/sheets' into yubo 5 years ago
Ulukyn c6d5163c1d Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 2c63a3aa96 Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 4709e766b9 Fixed: bad commit part 5 years ago
Ulukyn b2207337fa Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 47dc707c91 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 232af164ed Changed: remove sound of animals if sound context == 999 (for zig f 5 years ago
Ulukyn f18101d97e Added: Increase global density of vegetable 5 years ago
Ulukyn 0df2bdec2b Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn ed17e66d97 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 7f149563f6 Changed: fixed issue with bad continent names 5 years ago
Nimetu e22d271408 Added: require-all-skills property to sbrick sheet 5 years ago
Ulukyn d77d3b7102 Merge branch 'master' into new_interface_features 5 years ago
Ulukyn e049c34c8d Merge branch 'ryzom/ark/features' into atys 5 years ago
Ulukyn 6114cb1044 Merge branch 'ryzom/ui/improvements' into atys 5 years ago
Ulukyn 609d6b470f Merge branch 'feature-new-forage-sbrick' 5 years ago
Ulukyn 414011ee37 Merge branch 'master' into feature-new-forage-sbrick 5 years ago
Ulukyn b558a1a18b Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn b033942d36 Merge remote-tracking branch 'origin/ryzom/ui/improvements' into ryzom/ui/improvements 5 years ago
Ulukyn de8c9dddcb Added: new option to chat with npc when fame are < -30. Finish fast and temporary hack for who_am_i hide 5 years ago
Ulukyn 6e00000b9b Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 15ce2cd39c Added: new option to chat with npc when fame are < -30. Finish fast and temporary hack for who_am_i hide 5 years ago
Ulukyn f9738713a7 Changed: replace PrintfCommands by loadingTexts in cff to prevent overwrite of default values in user client.cfg 5 years ago
Ulukyn 20b1f3a4c5 Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 586d84bc20 Added: getContinentSheet lua function 5 years ago
Ulukyn b88341792a Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 1c562ddbe6 Merge remote-tracking branch 'origin/ryzom/ui/improvements' into ryzom/ui/improvements 5 years ago
Ulukyn 4675b8b8b9 Added: new way to manage news at loading screen 5 years ago
Ulukyn d2edcbf4ee Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 954151ca73 Added: new way to manage news at loading screen 5 years ago
Ulukyn 45b1bab23f Changed: Updated PrintfCommands for next Season 5 years ago
Ulukyn 123197b90b Merge branch 'atys' into yubo 5 years ago
Ulukyn 4b847a086a Changed: made setMap command available in FINAL_VERSION 5 years ago
Ulukyn 9f61f08e74 Merge branch 'new_interface_features' into yubo 5 years ago
Ulukyn aacbcf1e65 Merge branch 'master' into yubo 5 years ago
Ulukyn c838136d1a Merge branch 'master' into origin/new_interface_features 5 years ago
Ulukyn 0455d07125 Merge branch 'new_interface_features' 5 years ago
Ulukyn 6785217b3a Merge branch 'ryzom/ark/features' into atys 5 years ago
Ulukyn cc5423fdd5 Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn c22f8776f4 Added: encodeToHexa and decodeFromHexa 5 years ago
Nimetu f5c0cbcdf3 Changed: Also show item parts quantity on craft sbrick info window 5 years ago
Nimetu 8b2108af2f Merge commit 'fec9975f5' into atys 5 years ago
Ulukyn a7ca6f4499 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 9e5f20a679 Fixed: missing check 5 years ago
Ulukyn 11573ee85a Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 48a9a84d0e Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 2f27af125e Added: encodeURLParam 5 years ago
Ulukyn 10f864b234 Fixed: Remove blank space when an item menu are inactive 5 years ago
Ulukyn 0ac92bc08b Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 34c1265bce Revert "Merge remote-tracking branch 'origin/ryzom/ark/features' into ryzom/ark/features"
This reverts commit a6ee9fec63.
5 years ago
Ulukyn a6ee9fec63 Merge remote-tracking branch 'origin/ryzom/ark/features' into ryzom/ark/features 5 years ago
Ulukyn fe008c0e52 Added: moveCam and setCamMode lua functions 5 years ago
Ulukyn 935c5df73a Merge branch 'ryzom/ark/features' into yubo 5 years ago
Ulukyn 7a0737e759 Added: moveCam and setCamMode lua functions 5 years ago
Ulukyn 09d8346558 Merge branch 'atys' into ryzom/ark/features 5 years ago
Ulukyn 7f53767d85 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
karu 6a7fc98a52 Added: Show disabled until timer on icon 5 years ago
Ulukyn 3d919974cf Merge branch 'atys' into yubo 5 years ago
Ulukyn 691bf67c4d Changed: Updated version to 3.6.0 5 years ago
Ulukyn f053eaa157 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 30fabcbd0a Changed: Improvements in game context menu 5 years ago
Ulukyn 3966020294 Merge branch 'new_interface_features' into yubo 5 years ago
Ulukyn eeac201cf3 Merge branch 'master' into new_interface_features 5 years ago
Ulukyn 357e3f07e4 Merge branch 'ryzom/ui/improvements' into yubo 5 years ago
Ulukyn 188c3494fa Added: New way to add icons in Contextual Menus 5 years ago
Ulukyn 51776f9203 Merge branch 'storyline' into yubo 5 years ago
Ulukyn 7b8a4e2210 Merge branch 'new_interface_features' into yubo 5 years ago
Ulukyn 762dcd15e2 Merge branch 'new_interface_features' 5 years ago
Ulukyn ac43b90ba0 Merge branch 'master' into new_interface_features 5 years ago
Ulukyn df3c7c2f2e Merge remote-tracking branch 'origin/event_atysmas' 5 years ago
Ulukyn 780b9c7e63 Merge branch 'new_interface_features' 5 years ago
Ulukyn f4ee795fde Merge branch 'new_interface_features' into yubo 5 years ago
Ulukyn c521de1d48 Merge branch 'master' into new_interface_features 5 years ago
Riasan d5ceb97fa0 Merge branch 'master' into event_atysmas 5 years ago
Ulukyn cdc33730ad Merge branch 'rewards' 5 years ago
Ulukyn 305a27f0db Merge branch 'master' into rewards 5 years ago
Nimetu 4c1daee42c Merge with develop
--HG--
branch : yubo
5 years ago
Ulu Kyn b5b8de283b Merge with ark
--HG--
branch : atys
5 years ago
Ulu Kyn 7b3c09f873 Merge with ark
--HG--
branch : yubo
5 years ago
Ulu Kyn 3f7fc2e870 Fusion
--HG--
branch : yubo
5 years ago
Ulu Kyn 4c0438d702 Added: setChar3dDBfromVPX and getRefHeightScale lua commands
Added: getPlayerVpaHex, getPlayerVpbHex, getPlayerVpcHex lua commands
Added: getTargetVpaHex, getTargetVpbHex, getTargetVpcHex lua commands

--HG--
branch : ark
5 years ago
Ulu Kyn 139b03f0f1 Added: Add OBSERVER privs to teleport from map option
--HG--
branch : atys
5 years ago
Ulu Kyn 99caf036ff Fixed: Revert Bad commit
--HG--
branch : yubo
5 years ago
Ulu Kyn 6c35550c83 Merge with WinVS2017_debug
--HG--
branch : yubo
5 years ago
Ulu Kyn 8221ee2eb9 Merge with ark
--HG--
branch : yubo
5 years ago
Ulu Kyn fd1f151504 Fusion
--HG--
branch : yubo
5 years ago
Ulu Kyn c43b4b8bc0 Fusion
--HG--
branch : ark
5 years ago
Ulu Kyn a806758fad Added: brodcast messages can now trigger lua code
--HG--
branch : ark
5 years ago
Ulu Kyn 58e24f9c58 Added: run_action and stop_action lua to simulate key_press actions
--HG--
branch : ark
5 years ago
Herrah 99ededcfcb fix for error "cannot convert argument 1 from 'std::wstring' to 'LPCWSTR'"
--HG--
branch : fix-WinVS2017_debug
5 years ago
Ulu Kyn e32e4492ce Merge with ark
--HG--
branch : atys
5 years ago
Ulu Kyn e3dc99e078 Fixed: Change way to load lua zone files when are in a bnp
--HG--
branch : ark
5 years ago
Nuno Gonçalves 9e406019d8 Merge with develop
--HG--
branch : atys
5 years ago
Nuno Gonçalves 19789a2544 Merge with develop
--HG--
branch : atys
5 years ago
Nimetu e4cce24f80 Merge with html-improvements
--HG--
branch : yubo
5 years ago
Nimetu 2e3fa918d4 Merge with html-improvements
--HG--
branch : yubo
5 years ago
Nuno Gonçalves 89973681a2 Fusion
--HG--
branch : yubo
5 years ago
Nuno Gonçalves 683af88cb9 Merge ark into yubo
--HG--
branch : yubo
5 years ago
Nimetu da5b7212f8 Merge with html-improvements
--HG--
branch : yubo
5 years ago
Nimetu 14b1c1232a Merge with html-improvements
--HG--
branch : yubo
5 years ago
Nuno Gonçalves de69dfc285 Merge from new_interface_features 5 years ago
Nuno Gonçalves f5776610f1 Merge from new_interface_features 5 years ago
Inky 11f2044c7d Fusion 5 years ago
Nimetu b53d797745 Merge with feature-closest-landmarks-menu
--HG--
branch : yubo
6 years ago
Nimetu 8b4c179a15 Merge with develop
--HG--
branch : yubo
6 years ago
ulukyn 959d52fd80 Fusion avec fix-bitmap-crash
--HG--
branch : yubo
6 years ago
Nimetu b423c0f057 Merge with feature-item-icon-buffs
--HG--
branch : yubo
6 years ago
Nimetu 7148d476ad Merge with develop
--HG--
branch : yubo
6 years ago
Nimetu c9a5fbacd9 Changed: Disable r2_islands_textures, ai_build_wmap, build_world_packed_col because no server code in yubo/atys branch.
--HG--
branch : yubo
6 years ago
Inky bfbb8e1292 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky 045a80b59e Changed: removed tabulation event since not used
--HG--
branch : menu_navi
6 years ago
Inky 1ad5cf7a8e Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky c752619f13 Fixed: missing stream.h and import select var
--HG--
branch : menu_navi
6 years ago
Inky 26aef169b1 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky 8006dbeabe Changed: export reflect texture(pushed, over) on CCtrlTextButton element
--HG--
branch : menu_navi
6 years ago
Inky 6fdbdc9ed1 Fixed: record only key next/prior event on CCtrlScroll element
--HG--
branch : menu_navi
6 years ago
Inky f75e413994 Changed: new key pushed event: left-right-tabulation
--HG--
branch : menu_navi
6 years ago
Inky 3acbf83058 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky 77496daef4 Changed: new key pushed event to export
--HG--
branch : menu_navi
6 years ago
Inky c545629a10 Changed: import modal auto select first occurence
--HG--
branch : menu_navi
6 years ago
Inky 1910f7bc86 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky c1e76fcbb2 Changed: add character exportation handler
--HG--
branch : menu_navi
6 years ago
Inky 20fe11c53f Changed: add character importation handler
--HG--
branch : menu_navi
6 years ago
Inky 6fcb6f0669 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky a7cdf29463 Merge with lua
--HG--
branch : yubo
6 years ago
Inky b2b16e3cce Changed: fusion selection and creation handler
--HG--
branch : menu_navi
6 years ago
Inky 0f3f64cdc2 Changed: character creation handler
Todo: fusion both handler

--HG--
branch : menu_navi
6 years ago
Inky c8927c9c4b Changed: update button selection handler keyset_select
--HG--
branch : menu_navi
6 years ago
Inky 5d1233e805 Changed: update button selection handler mainland_select
--HG--
branch : menu_navi
6 years ago
Inky f5e9b7703c Changed: added keyboard events to CCtrlScroll elements
--HG--
branch : menu_navi
6 years ago
Inky 098df688b9 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky 6d16b46890 Merge with lua
--HG--
branch : yubo
6 years ago
Inky 331b0d8718 Fixed: bad condition to verify parent id
--HG--
branch : menu_navi
6 years ago
Inky d9cb317667 Merge with menu_navi
--HG--
branch : yubo
6 years ago
Inky 90e508032c Changed: character selection handler
--HG--
branch : menu_navi
6 years ago
Inky 4a5de4cb13 An attempt to support keyboard interaction out game
Create, select and delete character

--HG--
branch : menu_navi
6 years ago
Inky 9d294ef242 Merge with develop
--HG--
branch : yubo
6 years ago
Inky 860d6e2abb Merge with compatibility-develop
--HG--
branch : yubo
6 years ago
Inky bfab92082b Changed: char selection keyboard navigation handler
--HG--
branch : compatibility-develop
6 years ago
Inky 64e26124f8 Fusion 6 years ago
Inky 21dfa80b73 Changed: display version at login
--HG--
branch : compatibility-develop
6 years ago
Inky ac4d9efd8b Merge with lua
--HG--
branch : yubo
6 years ago
Inky 00f850f143 Merge with lua
--HG--
branch : compatibility-develop
6 years ago
Nimetu a4b3e57fd0 Merge with develop
--HG--
branch : yubo
6 years ago
Nimetu 8b2aef9317 Merge with develop
--HG--
branch : yubo
6 years ago
Nimetu c123f63afd Merge with feature-item-icon-buffs
--HG--
branch : yubo
6 years ago
Nimetu a22767af76 Merge with feature-item-icon-buffs
--HG--
branch : yubo
6 years ago
ulukyn f8af0da354 Étiquette Live-746 ajoutée à la révision 2102fb276eb6
--HG--
branch : yubo
6 years ago
Riasan 4f08aa3082 Merge: update with default 6 years ago
ulukyn 72d636ded1 Fusion 6 years ago
Riasan cba4d7948d Merge: update with chan_motd 6 years ago
ulukyn 739d000055 Merge from interface_textures 6 years ago
ulukyn 963162855c Merge from interface_textures 6 years ago
ulukyn 89ef083460 Fusion 6 years ago
Inky 795606628f Merge with chan_motd 6 years ago
Inky e572cc3e83 Fusion 6 years ago
ulukyn bf34575037 Merge from pact_interface 6 years ago
ulukyn 57a32f10ee Merge from interface_textures 6 years ago
ulukyn 6c9a8da387 Merge from new_interface_features 6 years ago
Riasan 2aa065d109 Merge: test fixes 6 years ago
ulukyn 41b0fac726 Merge from new_interface_features 6 years ago
ulukyn b7ec1c68ac Added: Commands in Animal menu to enter/leave a pet (zig) into the bag
Fixed: Pets inventory weight are correclty displayed now
6 years ago
ulukyn cc6159a9d5 Merge from pact_interface 6 years ago
Inky 438b521ece Changed: update msg.xml egs command for autopact 6 years ago
Ulukyn f5f4411a00 Fusion 6 years ago
Riasan 29cb0c579f Merge: update with default 6 years ago
ulukyn 8434cb1a34 Merge from haircuts 6 years ago
ulukyn 39004eb54b Merge from haircuts 6 years ago
Riasan d2df2043c5 Merge: test translations 6 years ago
Riasan d8cfde63f8 Merge: update with default 6 years ago
Nuno Gonçalves 617682afe6 Fusion 6 years ago
Nuno Gonçalves c9d19b4879 Adding: leveldesign bnp folder 6 years ago
ulukyn 0b507cba7b Merge from rewards 6 years ago
ulukyn db5a7b141a Merge with default 6 years ago
ulukyn 478e2a646f Merge from rewards 6 years ago
ulukyn 020c59153d Merge from rewards 6 years ago
ulukyn 4f1008a413 Merge with default 6 years ago
Riasan f14c4d7746 Merge: update with default 6 years ago
ulukyn 23fe859e19 Merge from translations 6 years ago
Riasan c6978f769f Merge:add deco_objects changes to yubo 6 years ago
Riasan 319ae23064 Merge:add translations changes to yubo 6 years ago
Riasan 3e2e6cb696 Merge: update with default 6 years ago
Riasan 3c66bf2ba2 Merge: update with default 6 years ago
Riasan 1390a45f71 Merge: update with default 6 years ago
ulukyn d599fa4c14 Auto-Merge from default 6 years ago
ulukyn b4d09e0774 Auto-Merge from default 6 years ago
ulukyn 6f65197479 Auto-Merge from default 6 years ago
ulukyn 569599281b Auto-Merge from default 6 years ago
ulukyn 10562b720b Auto-Merge from default 6 years ago
ulukyn 1fc73a8079 Auto-Merge from default 6 years ago
ulukyn f821ff6973 Auto-Merge from default 6 years ago
Riasan d51b3b2eae Merge: update with default 6 years ago
Riasan 90c99b0b0e Merge: fixes on default 6 years ago
Riasan 48b2e9799e Merge: update with default 6 years ago
Riasan 9c680f43ce Merge: from events_to_primitives 6 years ago
Riasan 537865cdb9 Merge: from marauder 6 years ago
ulukyn 60feb8bc57 Merge from purple_gubani 6 years ago
ulukyn dd6057ad71 Merge from rewards 6 years ago
Riasan 882e067fc0 Merge: update with default 6 years ago
Riasan a82a018f40 Merge: test matis_rite on Yubo 6 years ago
Riasan eb1c367464 Merge: test rewards on Yubo 6 years ago
teanwen 4ca7ea8957 Merge with purple_gubani 6 years ago
ulukyn 6c731f049e Merge from default 6 years ago
ulukyn 363a59d238 Merge from rewards 6 years ago
Riasan b59b8a51a9 Merge: test marauder on yubo 6 years ago
ulukyn 5648981968 Merge from rewards 6 years ago
Riasan c1510a8fb8 Merge: update with Default 6 years ago
Riasan beb3dca614 Merge: update with Default 6 years ago
Riasan 80204090d4 Merge: update with default 6 years ago
Riasan 57e55ed250 Merge: update with default 6 years ago
Riasan 5601d84d60 Merge: update with default 6 years ago
Riasan 2b24a51439 Merge: update with default 6 years ago
Riasan 3343f46e11 Merge: update with default 6 years ago
Riasan 82e5e1a4fc Merge: update with default 6 years ago
Riasan 19285bc8e9 Merge: update with default 6 years ago
Riasan cdbd2e1f47 Merge: update with default 6 years ago
Riasan f8a252abcf Merge: update with default 6 years ago
Ul U'Kyn 453c81bc7c Updated: Lot of fixes in PatchSystem 7 years ago
Riasan 56f450782f Merge: test fix_city_guards on Yubo 7 years ago
Riasan dda9dff6ba Merge: update with ark 7 years ago
Riasan e0266dedcb Merge: update with marauder 7 years ago
Riasan 28fd5a7265 Merge: update with purple_gubani 7 years ago
ulukyn 085770a098 Merge from purple_gubani 7 years ago
ulukyn a5f98add80 Merge from ark 7 years ago
ulukyn bb667c736c Changed: Increse MAX_INVENTORY_ANIMAL to 7, add AnimalTicket sitem type 7 years ago
ulukyn d824ff5baf Merge from deco_objects 7 years ago
ulukyn 6cc550732b Merge from marauder 7 years ago
ulukyn fcfb17c784 Changed: Increase FACTION_POINTS_, FAME:PLAYER and GUILD:FAME to 7 7 years ago
Riasan 22b06fdb3e Merge: test marauder on Yubo 7 years ago
Riasan 05baa720e9 Changed: static fame to display marauder fame (black_kami) into fame window 7 years ago
Riasan 8be4abf0fe default in matis_rite gemergt 7 years ago
Riasan f47f2b4801 default in purple_gubani gemergt 7 years ago
Riasan 7c8eb4b3c6 default in event_atysmas gemergt 7 years ago
Riasan 146ccbbe4c default in deco_objects gemergt 7 years ago
Ul U'Kyn eaf08e863e Update files after Patch 7 years ago
Riasan 5afbc26916 Merge: test translation on Yubo 7 years ago
Ul U'Kyn b5234633b4 Changed: sheet_id.bin and some patch system scripts 7 years ago
Riasan c60705a297 Merge: test deco_objects on Yubo 7 years ago
Ul U'Kyn 9d4829ec54 Changed: fixed patch system, update sheet_id.bin 7 years ago
Ul U'Kyn c37ef9592e Changed: Update sheet_id.bin, new nevrax@devl1:~/ryzom-data-dev$ 7 years ago
Ul U'Kyn af3fe227c8 Merge from default 8 years ago
Ul U'Kyn 0e122c76ba Changed: Added CREATE_TIME and SERIAL properties to items in database.xml 8 years ago
Nuno Gonçalves 14c7013348 Merge from default 8 years ago
Nuno Gonçalves fbf0d664fc Changed: commiting changes for new creatures of Xmas2016 8 years ago
Nuno Gonçalves 0fd0934111 Changed: Updated visual_slot.tab 8 years ago
Nuno Gonçalves aadf864e4e Changed: Updated sheets 8 years ago
vl f86da6ec78 Moving folders, cleaning repo. That's much better now ! :D 9 years ago

4
.gitignore vendored

@ -90,6 +90,7 @@ ylwrap
*.mk *.mk
# Visual Studio garbage # Visual Studio garbage
.vscode/
*.opensdf *.opensdf
UpgradeLog*.XML UpgradeLog*.XML
_UpgradeReport_Files _UpgradeReport_Files
@ -162,7 +163,9 @@ build/*
build-2010/* build-2010/*
build/* build/*
install/* install/*
win-build/
build_* build_*
install_*
nel/tools/build_gamedata/configuration/buildsite.py nel/tools/build_gamedata/configuration/buildsite.py
# Linux nel compile # Linux nel compile
@ -264,7 +267,6 @@ web/public_php/db_version_tool
web/public_php/db_version_web web/public_php/db_version_web
web/public_php/role_service web/public_php/role_service
web/public_php/role_support web/public_php/role_support
web/public_php/role_admin
web/public_php/role_domain web/public_php/role_domain
web/public_php/db_version_ring web/public_php/db_version_ring
web/public_php/config_user.php web/public_php/config_user.php

@ -1,27 +1,28 @@
4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 v0.8.0 4eddbaff0c5e5d685db96ee3e8427aa0fd96ac83 ryzomcore/v0.8.0
00d9b6e29e95f56785fbf85abe60afd34674f402 v0.9.0 00d9b6e29e95f56785fbf85abe60afd34674f402 ryzomcore/v0.9.0
79776c337176dd5b02e1a74fe5dfb703b91747aa v0.9.1 79776c337176dd5b02e1a74fe5dfb703b91747aa ryzomcore/v0.9.1
fedf2aa443d09707beed814b0f499c6a5519cc84 v0.10.0 fedf2aa443d09707beed814b0f499c6a5519cc84 ryzomcore/v0.10.0
edaa3624a56420b02ccc64c26059801a389927ee v0.11.0 edaa3624a56420b02ccc64c26059801a389927ee ryzomcore/v0.11.0
e3fe4855f22c3e75722e015dc33c091c340b3ad7 v0.11.1 e3fe4855f22c3e75722e015dc33c091c340b3ad7 ryzomcore/v0.11.1
9e583b717fd63be0be9fd60b99087abf1691ea49 v0.11.2 9e583b717fd63be0be9fd60b99087abf1691ea49 ryzomcore/v0.11.2
bfe5628e14a024ba7ea32e4b326ae433a07856b9 v0.11.3 bfe5628e14a024ba7ea32e4b326ae433a07856b9 ryzomcore/v0.11.3
9a6120735daa97c96ac5d85ca35c7f21f607bd87 v0.12.0 9a6120735daa97c96ac5d85ca35c7f21f607bd87 ryzomcore/v0.12.0
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 v1.0.0 3e17907af67e8d66d80e6b714707bbf912607f2a ryzom-patch-3.0.0
8eb94c3549be898fdc4a7c6d791d2477bdc11a18 v1.0.1 153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom-patch-3.0.1
3e17907af67e8d66d80e6b714707bbf912607f2a ryzom/3.0.0 9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom-patch-3.0.2
153e0b605c9e0c83ba05b6428c62838b49cc84b2 ryzom/3.0.1 4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom-patch-3.1.0
9d41f2994d44b9aad92b83f945f114e4b6bed44a ryzom/3.0.2 d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom-patch-3.1.0-hotfix
4300cc14aad098b1f86ea4c55577b7fa4a4cb5d2 ryzom/3.1.0 043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom-patch-3.1.0-april_patch
d4060f217f4f834cc62a33f2f1ccdf3c28298066 ryzom/3.1.0-hotfix 4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom-patch-3.2.0
043aaeb3d8a2a54177581b57bda87a9deaad510e ryzom/3.1.0-april_patch 18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom-patch-3.2.1
4036ecf59e83960f03acebc2089eb2ff5eeaed0a ryzom/3.2.0 822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom-patch-3.3.0
18403bb9485da3d9742c6f007a16d5619ebfb196 ryzom/3.2.1 00dde390a394fce9da06c2f3264140282158d39f ryzom-patch-3.3.0
822ff8f8917ad66e09e2c21c983282f6f693b9f6 ryzom/3.3.0 dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom-patch-3.3.1
00dde390a394fce9da06c2f3264140282158d39f ryzom/3.3.0 fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom-patch-3.4.0
dcd4c4d161ef775136e18c7e8f5072b75dede27e ryzom/3.3.1 70eba02e8eab6920586dbabf74e9e8180c729980 ryzom-patch-3.4.0 Steam Fix
fc4be8ebec5ca754ef4453bc6a9faef90837c674 ryzom/3.4.0 3941482843f9cd130cfc16634efc08d34a98ed35 ryzom-patch-3.4.0 Atysmas
70eba02e8eab6920586dbabf74e9e8180c729980 ryzom/3.4.0-steam_fix ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom-patch-3.5.0
3941482843f9cd130cfc16634efc08d34a98ed35 ryzom/3.4.0-atysmas 95783afa226f241062134eb62f4323295d29ac84 ryzom-patch-3.5.0.9637
ecae9feb4cceb78103e5d7236caccaf450796cdb ryzom/3.5.0 2102fb276eb69d49ed4923042215312a63c47c08 Live-746
95783afa226f241062134eb62f4323295d29ac84 ryzom/3.5.0.9637 8eb94c3549be898fdc4a7c6d791d2477bdc11a18 ryzomcore/v1.0.1
3e92c7104c20d6bc6c2147b4b5fc289e8621d322 ryzomcore/v1.0.0

@ -34,11 +34,37 @@ IF(COMMAND cmake_policy)
ENDIF() ENDIF()
ENDIF() ENDIF()
#-----------------------------------------------------------------------------
# Downloads and install Hunger into HUNTER_ROOT directory.
OPTION(HUNTER_ENABLED "Enable Hunter package manager" OFF)
IF(HUNTER_ENABLED)
INCLUDE("CMakeModules/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.321.tar.gz"
SHA1 "5e53cbb0429037ea8e2592bfd92704b8ff3ab492"
FILEPATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules/HunterConfig.cmake"
)
# default options for hunterized build
SET(WITH_STATIC ON CACHE BOOL "static" FORCE)
SET(WITH_STATIC_DRIVERS ON CACHE BOOL "static drivers" FORCE)
SET(WITH_STATIC_CURL ON CACHE BOOL "static curl" FORCE)
SET(WITH_STATIC_LIBXML2 ON CACHE BOOL "static libxml2" FORCE)
SET(WITH_STATIC_EXTERNAL ON CACHE BOOL "static external" FORCE)
SET(WITH_EXTERNAL OFF CACHE BOOL "external libs" FORCE)
ENDIF()
#-----------------------------------------------------------------------------
INCLUDE(nel) INCLUDE(nel)
INCLUDE(ConfigureChecks) INCLUDE(ConfigureChecks)
INCLUDE(CheckDepends) INCLUDE(CheckDepends)
INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL) INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL)
MESSAGE("EXTERNAL ${WITH_EXTERNAL}")
# Force out of source builds. # Force out of source builds.
CHECK_OUT_OF_SOURCE() CHECK_OUT_OF_SOURCE()
@ -53,12 +79,16 @@ ENDIF()
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(RyzomCore CXX C) PROJECT(RyzomCore CXX C)
SET(NL_VERSION_MAJOR 4) SET(NL_VERSION_MAJOR 1)
SET(NL_VERSION_MINOR 0) SET(NL_VERSION_MINOR 1)
SET(NL_VERSION_PATCH 0 CACHE STRING "Patch version") SET(NL_VERSION_PATCH 0 CACHE STRING "Patch version")
SET(YEAR "2001-${CURRENT_YEAR}") SET(YEAR "2001-${CURRENT_YEAR}")
SET(AUTHOR "Winch Gate and The Ryzom Core Community") SET(AUTHOR "Winch Gate and The Ryzom Core Community")
SET(RYZOM_VERSION_MAJOR 3)
SET(RYZOM_VERSION_MINOR 6)
SET(RYZOM_VERSION_PATCH 0)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Redirect output files # Redirect output files
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
@ -94,27 +124,27 @@ RYZOM_SETUP_PREFIX_PATHS()
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# Default values for URL's # Default values for URL's
SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Create Account URL") SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Create Account URL")
SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL") SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Edit Account URL")
SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL") SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://open.ryzom.dev/ams/" CACHE STRING "Ryzom Client Forget Password URL")
SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL") SET(RYZOM_CLIENT_PATCH_URL "https://cdn.ryzom.dev/open/patch/" CACHE STRING "Ryzom Client Patch URL")
SET(RYZOM_CLIENT_APP_NAME "default") SET(RYZOM_CLIENT_APP_NAME "default")
SET(RYZOM_CLIENT_RELEASENOTES_URL "https://open.ryzom.dev/releasenotes/index.php" CACHE STRING "Ryzom Client Release Notes URL") SET(RYZOM_WEBIG_MAIN_URL "https://open.ryzom.dev/" CACHE STRING "Ryzom Client WebIG Main URL")
SET(RYZOM_CLIENT_RELEASENOTES_RING_URL "https://open.ryzom.dev/releasenotes_ring/index.php" CACHE STRING "Ryzom Client Release Notes URL") SET(RYZOM_WEBIG_TRUSTED_DOMAIN "open.ryzom.dev" CACHE STRING "Ryzom Client WebIG Trusted Domain")
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# urls when compiling ryzom live client # urls when compiling ryzom live client
IF(WITH_RYZOM_LIVE) IF(WITH_RYZOM_LIVE)
MESSAGE("Using RYZOM_LIVE urls") MESSAGE("Using RYZOM_LIVE urls")
SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://account.ryzom.com/signup/from_client.php") SET(RYZOM_CLIENT_CREATE_ACCOUNT_URL "https://me.ryzom.com")
SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://account.ryzom.com/payment_profile/index.php") SET(RYZOM_CLIENT_EDIT_ACCOUNT_URL "https://me.ryzom.com")
SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://account.ryzom.com/payment_profile/lost_secure_password.php") SET(RYZOM_CLIENT_FORGET_PASSWORD_URL "https://me.ryzom.com/?forget_password=1")
SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live") SET(RYZOM_CLIENT_PATCH_URL "http://dl.ryzom.com/patch_live")
SET(RYZOM_CLIENT_APP_NAME "ryzom_live") SET(RYZOM_CLIENT_APP_NAME "ryzom_live")
SET(RYZOM_CLIENT_RELEASENOTES_URL "https://app.ryzom.com/releasenotes/index.php") SET(RYZOM_WEBIG_MAIN_URL "https://app.ryzom.com/")
SET(RYZOM_CLIENT_RELEASENOTES_RING_URL "https://app.ryzom.com/releasenotes_ring/index.php") SET(RYZOM_WEBIG_TRUSTED_DOMAIN "app.ryzom.com")
ENDIF() ENDIF()
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
@ -130,6 +160,28 @@ IF(WIN32)
ENDIF() ENDIF()
ENDIF() ENDIF()
IF(HUNTER_ENABLED)
## TODO: hack for freetype hunter package
SET(ON 1)
##
HUNTER_ADD_PACKAGE(ZLIB)
FIND_PACKAGE(ZLIB CONFIG REQUIRED)
SET(ZLIB_LIBRARY ZLIB::zlib)
HUNTER_ADD_PACKAGE(libxml2)
FIND_PACKAGE(libxml2 CONFIG REQUIRED)
SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} libxml2::libxml2)
HUNTER_ADD_PACKAGE(OpenSSL)
FIND_PACKAGE(OpenSSL REQUIRED)
# TODO: is OpenSSL::Crypto only needed for WIN32?
SET(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto)
# for precompiled headers, not needed if using TARGET_PRECOMPILE_HEADERS() from cmake 3.16+
SET(ZLIB_INCLUDE_DIR ZLIB_ROOT/include)
SET(LIBXML2_INCLUDE_DIR ${LIBXML2_ROOT}/include/libxml2)
ELSE()
FIND_PACKAGE(ZLIB REQUIRED) FIND_PACKAGE(ZLIB REQUIRED)
FIND_PACKAGE(LibXml2 REQUIRED) FIND_PACKAGE(LibXml2 REQUIRED)
FIND_PACKAGE(PNG REQUIRED) FIND_PACKAGE(PNG REQUIRED)
@ -140,6 +192,7 @@ FIND_PACKAGE(Jpeg)
IF(WIN32) IF(WIN32)
SET(OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES} Crypt32.lib) SET(OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES} Crypt32.lib)
ENDIF() ENDIF()
ENDIF() #hunter
IF(WITH_LIBOVR) IF(WITH_LIBOVR)
FIND_PACKAGE(LibOVR) FIND_PACKAGE(LibOVR)
@ -233,6 +286,7 @@ ENDIF()
INCLUDE(FindHelpers) INCLUDE(FindHelpers)
#TODO: hunter qt package
IF(WITH_QT5) IF(WITH_QT5)
FIND_QT5() FIND_QT5()
ENDIF() ENDIF()
@ -244,6 +298,7 @@ IF(WITH_QT)
FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtXml QtOpenGL REQUIRED) FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtXml QtOpenGL REQUIRED)
ENDIF() ENDIF()
#TODO: hunter assimp package
IF(WITH_ASSIMP) IF(WITH_ASSIMP)
FIND_PACKAGE(assimp REQUIRED) FIND_PACKAGE(assimp REQUIRED)
ENDIF() ENDIF()
@ -253,9 +308,20 @@ IF(WITH_NEL)
FIND_PACKAGE(CppTest) FIND_PACKAGE(CppTest)
ENDIF() ENDIF()
IF(WITH_GUI) IF(HUNTER_ENABLED)
FIND_PACKAGE(Luabind REQUIRED) IF(WITH_GUI)
ENDIF() HUNTER_ADD_PACKAGE(luabind)
FIND_PACKAGE(Luabind REQUIRED)
ENDIF()
HUNTER_ADD_PACKAGE(CURL)
FIND_PACKAGE(CURL CONFIG REQUIRED)
# TODO: for nelgui
SET(CURL_LIBRARIES CURL::libcurl libxml2::libxml2)
ELSE()
IF(WITH_GUI)
FIND_PACKAGE(Luabind REQUIRED)
ENDIF()
FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(CURL REQUIRED)
@ -306,6 +372,7 @@ IF(WITH_NEL)
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF() #hunter
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/nel/include)
ADD_SUBDIRECTORY(nel) ADD_SUBDIRECTORY(nel)

@ -69,7 +69,13 @@ MACRO(FIND_CORRECT_LUA_VERSION)
ENDIF() ENDIF()
ELSE() ELSE()
# TODO: find a way to detect Lua version # TODO: find a way to detect Lua version
IF(WITH_LUA53) IF(HUNTER_ENABLED)
HUNTER_ADD_PACKAGE(Lua)
FIND_PACKAGE(Lua CONFIG REQUIRED)
SET(LUA_LIBRARIES Lua::lua_lib)
ELSEIF(WITH_LUA54)
FIND_PACKAGE(Lua54 REQUIRED)
ELSEIF(WITH_LUA53)
FIND_PACKAGE(Lua53 REQUIRED) FIND_PACKAGE(Lua53 REQUIRED)
ELSEIF(WITH_LUA52) ELSEIF(WITH_LUA52)
FIND_PACKAGE(Lua52 REQUIRED) FIND_PACKAGE(Lua52 REQUIRED)
@ -89,6 +95,21 @@ ENDIF()
SET(LIBRARY_NAME_RELEASE) SET(LIBRARY_NAME_RELEASE)
SET(LIBRARY_NAME_DEBUG) SET(LIBRARY_NAME_DEBUG)
IF(WITH_LUA54)
IF(WITH_STLPORT)
LIST(APPEND LIBRARY_NAME_RELEASE luabind_stlport_lua54)
LIST(APPEND LIBRARY_NAME_DEBUG luabind_stlport_lua54d)
ENDIF()
LIST(APPEND LIBRARY_NAME_RELEASE luabind_lua54)
LIST(APPEND LIBRARY_NAME_DEBUG luabind_lua54d)
ENDIF()
IF(HUNTER_ENABLED)
LIST(APPEND LIBRARY_NAME_RELEASE luabind luabind09)
LIST(APPEND LIBRARY_NAME_DEBUG luabindd luabind09-d)
ENDIF()
IF(WITH_LUA53) IF(WITH_LUA53)
IF(WITH_STLPORT) IF(WITH_STLPORT)
LIST(APPEND LIBRARY_NAME_RELEASE luabind_stlport_lua53) LIST(APPEND LIBRARY_NAME_RELEASE luabind_stlport_lua53)

@ -501,6 +501,17 @@ IF(WINSDK_INCLUDE_DIR)
IF(WINSDK_VERSION STREQUAL "7.1" AND (MSVC11 OR MSVC12 OR MSVC14)) IF(WINSDK_VERSION STREQUAL "7.1" AND (MSVC11 OR MSVC12 OR MSVC14))
ADD_DEFINITIONS(-D_USING_V110_SDK71_) ADD_DEFINITIONS(-D_USING_V110_SDK71_)
ENDIF() ENDIF()
IF(NOT DXSDK_DIR)
MESSAGE("Using DirectX from Windows SDK (${WINSDK_LIBRARY_DIRS})")
SET(DXSDK_DIR ${WINSDK_DIR})
FIND_LIBRARY(DXSDK_GUID_LIBRARY dxguid ${WINSDK_LIBRARY_DIRS})
FIND_LIBRARY(DXSDK_DINPUT_LIBRARY dinput8 ${WINSDK_LIBRARY_DIRS})
FIND_LIBRARY(DXSDK_DSOUND_LIBRARY dsound ${WINSDK_LIBRARY_DIRS})
FIND_LIBRARY(DXSDK_XAUDIO_LIBRARY xaudio2 ${WINSDK_LIBRARY_DIRS})
# TODO: FIND_LIBRARY(DXSDK_D3DX9_LIBRARY d3dx9)
FIND_LIBRARY(DXSDK_D3D9_LIBRARY d3d9 ${WINSDK_LIBRARY_DIRS})
ENDIF()
ELSE() ELSE()
IF(NOT WindowsSDK_FIND_QUIETLY) IF(NOT WindowsSDK_FIND_QUIETLY)
MESSAGE(STATUS "Warning: Unable to find Windows SDK!") MESSAGE(STATUS "Warning: Unable to find Windows SDK!")

@ -0,0 +1,8 @@
# This file is parsed by HunterGate command
hunter_config(luabind
VERSION 0.9.1
URL "https://github.com/nimetu/luabind/tarball/2fa4606"
SHA1 "3b4646bab9f0b2362d7b8d71d78e40deaf3cc747"
)

@ -0,0 +1,537 @@
# Copyright (c) 2013-2019, Ruslan Baratov
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# This is a gate file to Hunter package manager.
# Include this file using `include` command and add package you need, example:
#
# cmake_minimum_required(VERSION 3.2)
#
# include("cmake/HunterGate.cmake")
# HunterGate(
# URL "https://github.com/path/to/hunter/archive.tar.gz"
# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d"
# )
#
# project(MyProject)
#
# hunter_add_package(Foo)
# hunter_add_package(Boo COMPONENTS Bar Baz)
#
# Projects:
# * https://github.com/hunter-packages/gate/
# * https://github.com/ruslo/hunter
option(HUNTER_ENABLED "Enable Hunter package manager support" ON)
if(HUNTER_ENABLED)
if(CMAKE_VERSION VERSION_LESS "3.2")
message(
FATAL_ERROR
"At least CMake version 3.2 required for Hunter dependency management."
" Update CMake or set HUNTER_ENABLED to OFF."
)
endif()
endif()
include(CMakeParseArguments) # cmake_parse_arguments
option(HUNTER_STATUS_PRINT "Print working status" ON)
option(HUNTER_STATUS_DEBUG "Print a lot info" OFF)
option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON)
set(HUNTER_ROOT "" CACHE FILEPATH "Override the HUNTER_ROOT.")
set(HUNTER_ERROR_PAGE "https://hunter.readthedocs.io/en/latest/reference/errors")
function(hunter_gate_status_print)
if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG)
foreach(print_message ${ARGV})
message(STATUS "[hunter] ${print_message}")
endforeach()
endif()
endfunction()
function(hunter_gate_status_debug)
if(HUNTER_STATUS_DEBUG)
foreach(print_message ${ARGV})
string(TIMESTAMP timestamp)
message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}")
endforeach()
endif()
endfunction()
function(hunter_gate_error_page error_page)
message("------------------------------ ERROR ------------------------------")
message(" ${HUNTER_ERROR_PAGE}/${error_page}.html")
message("-------------------------------------------------------------------")
message("")
message(FATAL_ERROR "")
endfunction()
function(hunter_gate_internal_error)
message("")
foreach(print_message ${ARGV})
message("[hunter ** INTERNAL **] ${print_message}")
endforeach()
message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
message("")
hunter_gate_error_page("error.internal")
endfunction()
function(hunter_gate_fatal_error)
cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}")
if("${hunter_ERROR_PAGE}" STREQUAL "")
hunter_gate_internal_error("Expected ERROR_PAGE")
endif()
message("")
foreach(x ${hunter_UNPARSED_ARGUMENTS})
message("[hunter ** FATAL ERROR **] ${x}")
endforeach()
message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]")
message("")
hunter_gate_error_page("${hunter_ERROR_PAGE}")
endfunction()
function(hunter_gate_user_error)
hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data")
endfunction()
function(hunter_gate_self root version sha1 result)
string(COMPARE EQUAL "${root}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("root is empty")
endif()
string(COMPARE EQUAL "${version}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("version is empty")
endif()
string(COMPARE EQUAL "${sha1}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("sha1 is empty")
endif()
string(SUBSTRING "${sha1}" 0 7 archive_id)
if(EXISTS "${root}/cmake/Hunter")
set(hunter_self "${root}")
else()
set(
hunter_self
"${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked"
)
endif()
set("${result}" "${hunter_self}" PARENT_SCOPE)
endfunction()
# Set HUNTER_GATE_ROOT cmake variable to suitable value.
function(hunter_gate_detect_root)
# Check CMake variable
if(HUNTER_ROOT)
set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE)
hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable")
return()
endif()
# Check environment variable
if(DEFINED ENV{HUNTER_ROOT})
set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE)
hunter_gate_status_debug("HUNTER_ROOT detected by environment variable")
return()
endif()
# Check HOME environment variable
if(DEFINED ENV{HOME})
set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE)
hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable")
return()
endif()
# Check SYSTEMDRIVE and USERPROFILE environment variable (windows only)
if(WIN32)
if(DEFINED ENV{SYSTEMDRIVE})
set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE)
hunter_gate_status_debug(
"HUNTER_ROOT set using SYSTEMDRIVE environment variable"
)
return()
endif()
if(DEFINED ENV{USERPROFILE})
set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE)
hunter_gate_status_debug(
"HUNTER_ROOT set using USERPROFILE environment variable"
)
return()
endif()
endif()
hunter_gate_fatal_error(
"Can't detect HUNTER_ROOT"
ERROR_PAGE "error.detect.hunter.root"
)
endfunction()
function(hunter_gate_download dir)
string(
COMPARE
NOTEQUAL
"$ENV{HUNTER_DISABLE_AUTOINSTALL}"
""
disable_autoinstall
)
if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL)
hunter_gate_fatal_error(
"Hunter not found in '${dir}'"
"Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'"
"Settings:"
" HUNTER_ROOT: ${HUNTER_GATE_ROOT}"
" HUNTER_SHA1: ${HUNTER_GATE_SHA1}"
ERROR_PAGE "error.run.install"
)
endif()
string(COMPARE EQUAL "${dir}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("Empty 'dir' argument")
endif()
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("HUNTER_GATE_SHA1 empty")
endif()
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad)
if(is_bad)
hunter_gate_internal_error("HUNTER_GATE_URL empty")
endif()
set(done_location "${dir}/DONE")
set(sha1_location "${dir}/SHA1")
set(build_dir "${dir}/Build")
set(cmakelists "${dir}/CMakeLists.txt")
hunter_gate_status_debug("Locking directory: ${dir}")
file(LOCK "${dir}" DIRECTORY GUARD FUNCTION)
hunter_gate_status_debug("Lock done")
if(EXISTS "${done_location}")
# while waiting for lock other instance can do all the job
hunter_gate_status_debug("File '${done_location}' found, skip install")
return()
endif()
file(REMOVE_RECURSE "${build_dir}")
file(REMOVE_RECURSE "${cmakelists}")
file(MAKE_DIRECTORY "${build_dir}") # check directory permissions
# Disabling languages speeds up a little bit, reduces noise in the output
# and avoids path too long windows error
file(
WRITE
"${cmakelists}"
"cmake_minimum_required(VERSION 3.2)\n"
"project(HunterDownload LANGUAGES NONE)\n"
"include(ExternalProject)\n"
"ExternalProject_Add(\n"
" Hunter\n"
" URL\n"
" \"${HUNTER_GATE_URL}\"\n"
" URL_HASH\n"
" SHA1=${HUNTER_GATE_SHA1}\n"
" DOWNLOAD_DIR\n"
" \"${dir}\"\n"
" TLS_VERIFY\n"
" ${HUNTER_TLS_VERIFY}\n"
" SOURCE_DIR\n"
" \"${dir}/Unpacked\"\n"
" CONFIGURE_COMMAND\n"
" \"\"\n"
" BUILD_COMMAND\n"
" \"\"\n"
" INSTALL_COMMAND\n"
" \"\"\n"
")\n"
)
if(HUNTER_STATUS_DEBUG)
set(logging_params "")
else()
set(logging_params OUTPUT_QUIET)
endif()
hunter_gate_status_debug("Run generate")
# Need to add toolchain file too.
# Otherwise on Visual Studio + MDD this will fail with error:
# "Could not find an appropriate version of the Windows 10 SDK installed on this machine"
if(EXISTS "${CMAKE_TOOLCHAIN_FILE}")
get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE)
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}")
else()
# 'toolchain_arg' can't be empty
set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=")
endif()
string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make)
if(no_make)
set(make_arg "")
else()
# Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM
set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}")
endif()
execute_process(
COMMAND
"${CMAKE_COMMAND}"
"-H${dir}"
"-B${build_dir}"
"-G${CMAKE_GENERATOR}"
"${toolchain_arg}"
${make_arg}
WORKING_DIRECTORY "${dir}"
RESULT_VARIABLE download_result
${logging_params}
)
if(NOT download_result EQUAL 0)
hunter_gate_internal_error(
"Configure project failed."
"To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}"
"In directory ${dir}"
)
endif()
hunter_gate_status_print(
"Initializing Hunter workspace (${HUNTER_GATE_SHA1})"
" ${HUNTER_GATE_URL}"
" -> ${dir}"
)
execute_process(
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}"
WORKING_DIRECTORY "${dir}"
RESULT_VARIABLE download_result
${logging_params}
)
if(NOT download_result EQUAL 0)
hunter_gate_internal_error("Build project failed")
endif()
file(REMOVE_RECURSE "${build_dir}")
file(REMOVE_RECURSE "${cmakelists}")
file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}")
file(WRITE "${done_location}" "DONE")
hunter_gate_status_debug("Finished")
endfunction()
# Must be a macro so master file 'cmake/Hunter' can
# apply all variables easily just by 'include' command
# (otherwise PARENT_SCOPE magic needed)
macro(HunterGate)
if(HUNTER_GATE_DONE)
# variable HUNTER_GATE_DONE set explicitly for external project
# (see `hunter_download`)
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
endif()
# First HunterGate command will init Hunter, others will be ignored
get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET)
if(NOT HUNTER_ENABLED)
# Empty function to avoid error "unknown function"
function(hunter_add_package)
endfunction()
set(
_hunter_gate_disabled_mode_dir
"${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode"
)
if(EXISTS "${_hunter_gate_disabled_mode_dir}")
hunter_gate_status_debug(
"Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}"
)
list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}")
endif()
elseif(_hunter_gate_done)
hunter_gate_status_debug("Secondary HunterGate (use old settings)")
hunter_gate_self(
"${HUNTER_CACHED_ROOT}"
"${HUNTER_VERSION}"
"${HUNTER_SHA1}"
_hunter_self
)
include("${_hunter_self}/cmake/Hunter")
else()
set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}")
string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name)
if(_have_project_name)
hunter_gate_fatal_error(
"Please set HunterGate *before* 'project' command. "
"Detected project: ${PROJECT_NAME}"
ERROR_PAGE "error.huntergate.before.project"
)
endif()
cmake_parse_arguments(
HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV}
)
string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1)
string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url)
string(
COMPARE
NOTEQUAL
"${HUNTER_GATE_UNPARSED_ARGUMENTS}"
""
_have_unparsed
)
string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global)
string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath)
if(_have_unparsed)
hunter_gate_user_error(
"HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}"
)
endif()
if(_empty_sha1)
hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory")
endif()
if(_empty_url)
hunter_gate_user_error("URL suboption of HunterGate is mandatory")
endif()
if(_have_global)
if(HUNTER_GATE_LOCAL)
hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)")
endif()
if(_have_filepath)
hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)")
endif()
endif()
if(HUNTER_GATE_LOCAL)
if(_have_global)
hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)")
endif()
if(_have_filepath)
hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)")
endif()
endif()
if(_have_filepath)
if(_have_global)
hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)")
endif()
if(HUNTER_GATE_LOCAL)
hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)")
endif()
endif()
hunter_gate_detect_root() # set HUNTER_GATE_ROOT
# Beautify path, fix probable problems with windows path slashes
get_filename_component(
HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE
)
hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}")
if(NOT HUNTER_ALLOW_SPACES_IN_PATH)
string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces)
if(NOT _contain_spaces EQUAL -1)
hunter_gate_fatal_error(
"HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces."
"Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error"
"(Use at your own risk!)"
ERROR_PAGE "error.spaces.in.hunter.root"
)
endif()
endif()
string(
REGEX
MATCH
"[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*"
HUNTER_GATE_VERSION
"${HUNTER_GATE_URL}"
)
string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty)
if(_is_empty)
set(HUNTER_GATE_VERSION "unknown")
endif()
hunter_gate_self(
"${HUNTER_GATE_ROOT}"
"${HUNTER_GATE_VERSION}"
"${HUNTER_GATE_SHA1}"
_hunter_self
)
set(_master_location "${_hunter_self}/cmake/Hunter")
if(EXISTS "${HUNTER_GATE_ROOT}/cmake/Hunter")
# Hunter downloaded manually (e.g. by 'git clone')
set(_unused "xxxxxxxxxx")
set(HUNTER_GATE_SHA1 "${_unused}")
set(HUNTER_GATE_VERSION "${_unused}")
else()
get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE)
set(_done_location "${_archive_id_location}/DONE")
set(_sha1_location "${_archive_id_location}/SHA1")
# Check Hunter already downloaded by HunterGate
if(NOT EXISTS "${_done_location}")
hunter_gate_download("${_archive_id_location}")
endif()
if(NOT EXISTS "${_done_location}")
hunter_gate_internal_error("hunter_gate_download failed")
endif()
if(NOT EXISTS "${_sha1_location}")
hunter_gate_internal_error("${_sha1_location} not found")
endif()
file(READ "${_sha1_location}" _sha1_value)
string(TOLOWER "${_sha1_value}" _sha1_value_lower)
string(TOLOWER "${HUNTER_GATE_SHA1}" _HUNTER_GATE_SHA1_lower)
string(COMPARE EQUAL "${_sha1_value_lower}" "${_HUNTER_GATE_SHA1_lower}" _is_equal)
if(NOT _is_equal)
hunter_gate_internal_error(
"Short SHA1 collision:"
" ${_sha1_value} (from ${_sha1_location})"
" ${HUNTER_GATE_SHA1} (HunterGate)"
)
endif()
if(NOT EXISTS "${_master_location}")
hunter_gate_user_error(
"Master file not found:"
" ${_master_location}"
"try to update Hunter/HunterGate"
)
endif()
endif()
include("${_master_location}")
set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES)
endif()
endmacro()

@ -121,6 +121,22 @@ MACRO(NL_ADD_RUNTIME_FLAGS name)
ENDMACRO(NL_ADD_RUNTIME_FLAGS) ENDMACRO(NL_ADD_RUNTIME_FLAGS)
MACRO(NL_ADD_STATIC_VID_DRIVERS name) MACRO(NL_ADD_STATIC_VID_DRIVERS name)
IF(HUNTER_ENABLED)
IF(WIN32)
SET(drv_suffix "_win")
ELSE()
SET(drv_suffix "")
ENDIF()
IF(WIN32 AND WITH_DRIVER_DIRECT3D)
TARGET_LINK_LIBRARIES(${name} nel_drv_direct3d${drv_suffix})
ENDIF()
IF(WITH_DRIVER_OPENGL)
TARGET_LINK_LIBRARIES(${name} nel_drv_opengl${drv_suffix})
ENDIF()
IF(WITH_DRIVER_OPENGLES)
TARGET_LINK_LIBRARIES(${name} nel_drv_opengles${drv_suffix})
ENDIF()
ELSE()
IF(WITH_STATIC_DRIVERS) IF(WITH_STATIC_DRIVERS)
IF(WIN32) IF(WIN32)
IF(WITH_DRIVER_DIRECT3D) IF(WITH_DRIVER_DIRECT3D)
@ -144,9 +160,29 @@ MACRO(NL_ADD_STATIC_VID_DRIVERS name)
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF()#hunter
ENDMACRO(NL_ADD_STATIC_VID_DRIVERS) ENDMACRO(NL_ADD_STATIC_VID_DRIVERS)
MACRO(NL_ADD_STATIC_SND_DRIVERS name) MACRO(NL_ADD_STATIC_SND_DRIVERS name)
IF(HUNTER_ENABLED)
IF(WIN32)
SET(drv_suffix "_win")
ELSE()
SET(drv_suffix "")
ENDIF()
IF(WIN32 AND WITH_DRIVER_DSOUND)
TARGET_LINK_LIBRARIES(${name} nel_drv_dsound${drv_suffix})
ENDIF()
IF(WIN32 AND WITH_DRIVER_XAUDIO2)
TARGET_LINK_LIBRARIES(${name} nel_drv_xaudio2${drv_suffix})
ENDIF()
IF(WITH_DRIVER_FMOD)
TARGET_LINK_LIBRARIES(${name} nel_drv_fmod${drv_suffix})
ENDIF()
IF(WITH_DRIVER_OPENAL)
TARGET_LINK_LIBRARIES(${name} nel_drv_openal${drv_suffix})
ENDIF()
ELSE()
IF(WITH_STATIC_DRIVERS) IF(WITH_STATIC_DRIVERS)
IF(WIN32) IF(WIN32)
IF(WITH_DRIVER_DSOUND) IF(WITH_DRIVER_DSOUND)
@ -175,6 +211,7 @@ MACRO(NL_ADD_STATIC_SND_DRIVERS name)
ENDIF() ENDIF()
ENDIF() ENDIF()
ENDIF() #hunter
ENDMACRO(NL_ADD_STATIC_SND_DRIVERS) ENDMACRO(NL_ADD_STATIC_SND_DRIVERS)
### ###
@ -249,6 +286,8 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS)
OPTION(WITH_ASSIMP "Use assimp exporter" OFF) OPTION(WITH_ASSIMP "Use assimp exporter" OFF)
OPTION(WITH_LIBGSF "Use libgsf for max file library" OFF) OPTION(WITH_LIBGSF "Use libgsf for max file library" OFF)
OPTION(WITH_FFMPEG "Use ffmpeg for audio decoder" OFF)
### ###
# GUI toolkits # GUI toolkits
### ###
@ -282,7 +321,7 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS)
OPTION(WITH_SNOWBALLS "Build Snowballs." OFF) OPTION(WITH_SNOWBALLS "Build Snowballs." OFF)
OPTION(WITH_TOOLS "Build Tools" OFF) OPTION(WITH_TOOLS "Build Tools" OFF)
OPTION(WITH_RYZOM_LIVE "Use ryzom.com urls" OFF) OPTION(WITH_RYZOM_LIVE "Use ryzom.com urls" ON)
ENDMACRO(NL_SETUP_DEFAULT_OPTIONS) ENDMACRO(NL_SETUP_DEFAULT_OPTIONS)
MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS) MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS)
@ -1193,7 +1232,11 @@ MACRO(SETUP_EXTERNAL)
ENDIF() ENDIF()
IF(WIN32) IF(WIN32)
FIND_PACKAGE(External REQUIRED) IF (HUNTER_ENABLED)
FIND_PACKAGE(External QUIET)
ELSE()
FIND_PACKAGE(External REQUIRED)
ENDIF()
# If using custom boost, we need to define the right variables used by official boost CMake module # If using custom boost, we need to define the right variables used by official boost CMake module
IF(DEFINED BOOST_DIR) IF(DEFINED BOOST_DIR)
@ -1236,7 +1279,7 @@ MACRO(SETUP_EXTERNAL)
IF(WIN32) IF(WIN32)
# Must include DXSDK before WINSDK # Must include DXSDK before WINSDK
FIND_PACKAGE(DirectXSDK REQUIRED) FIND_PACKAGE(DirectXSDK)
# IF(DXSDK_INCLUDE_DIR) # IF(DXSDK_INCLUDE_DIR)
# INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR}) # INCLUDE_DIRECTORIES(${DXSDK_INCLUDE_DIR})
# ENDIF() # ENDIF()
@ -1245,5 +1288,8 @@ MACRO(SETUP_EXTERNAL)
IF(MSVC) IF(MSVC)
FIND_PACKAGE(MSVC REQUIRED) FIND_PACKAGE(MSVC REQUIRED)
FIND_PACKAGE(WindowsSDK REQUIRED) FIND_PACKAGE(WindowsSDK REQUIRED)
IF(NOT DXSDK_DIR)
MESSAGE(FATAL_ERROR "DirectX SDK or DirectX files from Windows SDK not found.")
ENDIF()
ENDIF() ENDIF()
ENDMACRO() ENDMACRO()

@ -1,59 +1,55 @@
jobs: jobs:
- job: ubuntu16 - job: ubuntu18
timeoutInMinutes: 120 timeoutInMinutes: 120
pool: pool:
vmImage: 'Ubuntu-16.04' vmImage: 'ubuntu-18.04'
steps: steps:
- script: | - script: |
sudo apt-get update sudo apt update
sudo apt-get install -y software-properties-common sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ubuntu-toolchain-r/test # sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update sudo apt update
sudo apt-get install cmake build-essential -y sudo apt install cmake build-essential -y
sudo apt-get install gcc-8 g++-8 -y sudo apt install gcc-8 g++-8 -y
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 60 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 60 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 60
sudo apt-get install bison autoconf automake -y sudo apt install bison autoconf automake -y
sudo apt-get install libpng12-dev -y sudo apt install libpng-dev -y
sudo apt-get install libjpeg-dev -y sudo apt install libjpeg-dev -y
sudo apt-get install libgif-dev libfreetype6-dev -y sudo apt install libgif-dev libfreetype6-dev -y
sudo apt-get install freeglut3-dev -y sudo apt install freeglut3-dev -y
sudo apt-get install liblua5.1-dev libluabind-dev libcpptest-dev -y sudo apt install liblua5.2-dev libluabind-dev libcpptest-dev -y
sudo apt-get install libogg-dev libvorbis-dev libopenal-dev -y sudo apt install libogg-dev libvorbis-dev libopenal-dev -y
sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev libswscale-dev libpostproc-dev -y sudo apt install libavcodec-dev libavformat-dev libavdevice-dev libswscale-dev libpostproc-dev -y
sudo apt-get install libmysqlclient-dev -y sudo apt install libmysqlclient-dev -y
sudo apt-get install libxml2-dev -y sudo apt install libxml2-dev -y
sudo apt-get install libcurl4-openssl-dev libssl-dev -y sudo apt install libcurl4-openssl-dev libssl-dev -y
sudo apt-get install libsquish-dev -y sudo apt install libsquish-dev -y
sudo apt-get install liblzma-dev -y sudo apt install liblzma-dev -y
sudo apt-get install libgsf-1-dev -y sudo apt install libgsf-1-dev -y
sudo apt-get install qtbase5-dev qttools5-dev qttools5-dev-tools sudo apt install qtbase5-dev qttools5-dev qttools5-dev-tools
displayName: 'Dependencies' displayName: 'Dependencies'
- script: | - script: |
mkdir build mkdir build
cmake --version cmake --version
cd build cd build
cmake -DWITH_STATIC=ON -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=ON -DWITH_LUA51=ON -DWITH_RYZOM=ON -DWITH_RYZOM_SERVER=ON -DWITH_RYZOM_CLIENT=ON -DWITH_RYZOM_TOOLS=ON -DWITH_NEL_TOOLS=ON -DWITH_NELNS=ON -DWITH_NELNS_LOGIN_SYSTEM=ON -DWITH_NELNS_SERVER=ON -DWITH_QT5=ON -DWITH_LIBGSF=ON .. cmake -DWITH_STATIC=ON -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=ON -DWITH_LUA51=OFF -DWITH_LUA52=ON -DWITH_RYZOM=ON -DWITH_RYZOM_SERVER=ON -DWITH_RYZOM_CLIENT=ON -DWITH_RYZOM_TOOLS=ON -DWITH_NEL_TOOLS=ON -DWITH_NELNS=ON -DWITH_NELNS_LOGIN_SYSTEM=ON -DWITH_NELNS_SERVER=ON -DWITH_QT5=ON -DWITH_LIBGSF=ON ..
cat CMakeCache.txt cat CMakeCache.txt
displayName: 'CMake' displayName: 'CMake'
- script: | - script: |
cd build cd build
make -j`nproc` make -j`nproc`
displayName: 'Make' displayName: 'Make'
- job: ubuntu18 - job: ubuntu20
timeoutInMinutes: 120 timeoutInMinutes: 120
pool: pool:
vmImage: 'ubuntu-18.04' vmImage: 'ubuntu-20.04'
steps: steps:
- script: | - script: |
sudo apt update sudo apt update
sudo apt install -y software-properties-common sudo apt install -y software-properties-common
# sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update sudo apt update
sudo apt install cmake build-essential -y sudo apt install cmake build-essential -y
sudo apt install gcc-8 g++-8 -y
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 60
sudo apt install bison autoconf automake -y sudo apt install bison autoconf automake -y
sudo apt install libpng-dev -y sudo apt install libpng-dev -y
sudo apt install libjpeg-dev -y sudo apt install libjpeg-dev -y
@ -81,3 +77,88 @@ jobs:
cd build cd build
make -j`nproc` make -j`nproc`
displayName: 'Make' displayName: 'Make'
- job: windows2019
timeoutInMinutes: 120
pool:
vmImage: 'windows-2019'
steps:
- checkout: self
fetchDepth: 1
- task: Cache@2
inputs:
key: 'hunter-win2019-x64-rel'
path: "c:/.hunter/_Base/Cache"
- task: CmdLine@2
inputs:
script: |
aria2c https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe
7z x DXSDK_Jun10.exe -oC:\ -r -y
del DXSDK_Jun10.exe
- task: CMake@1
inputs:
workingDirectory: build.release
cmakeArgs: '-DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=ON -DWITH_DRIVER_XAUDIO2=ON -DDXSDK_DIR=C:/DXSDK ..'
- task: MSBuild@1
inputs:
solution: build.release/ALL_BUILD.vcxproj
maximumCpuCount: true
configuration: release
platform: 'x64'
- job: ubuntu18hunter
timeoutInMinutes: 120
pool:
vmImage: ubuntu-18.04
steps:
- checkout: self
fetchDepth: 0
- script: |
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends libasound2-dev libgl1-mesa-dev libjack-dev libpulse-dev libxrandr-dev libxrender-dev libxxf86vm-dev
displayName: 'Dependencies'
- task: Cache@2
inputs:
key: 'hunter317-ubuntu18-rel"'
path: "$(Pipeline.Workspace)/.hunter/_Base/Cache"
- script: |
mkdir build.release
cmake --version
cd build.release
unset SYSTEM
export MAKEFLAGS=-j`nproc`
cmake -DCMAKE_BUILD_TYPE=Release -DHUNTER_ENABLED=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON ..
displayName: 'CMake, release'
- script: |
cd build.release
make -j`nproc`
displayName: 'Make, release'
#- task: PublishPipelineArtifact@1
# inputs:
# targetPath: build.release/bin
# artifactName: RyzomUbuntu18Release
- job: macOS11
timeoutInMinutes: 120
pool:
vmImage: 'macOS-11'
steps:
- checkout: self
fetchDepth: 0
- task: Cache@2
inputs:
key: 'hunter317-macOS11-rel"'
path: "$(Pipeline.Workspace)/.hunter/_Base/Cache"
- task: CMake@1
inputs:
workingDirectory: build.release
cmakeArgs: '-GXcode -DCMAKE_CONFIGURATION_TYPES=Release -DHUNTER_ENABLED=ON -DHUNTER_STATUS_DEBUG=ON -DHUNTER_CONFIGURATION_TYPES=Release -DHUNTER_ROOT="$(Pipeline.Workspace)/.hunter" -DWITH_LIBXML2_ICONV=OFF -DFINAL_VERSION=OFF -DWITH_NEL_TESTS=OFF -DWITH_NEL_SAMPLES=OFF -DWITH_NEL_TOOLS=OFF -DWITH_RYZOM_TOOLS=OFF -DWITH_RYZOM_SERVER=OFF -DWITH_RYZOM_CLIENT=ON -DWITH_DRIVER_OPENGL=ON -DWITH_DRIVER_OPENAL=ON -DWITH_DRIVER_DIRECT3D=OFF -DWITH_DRIVER_XAUDIO2=OFF ..'
- task: Xcode@5
inputs:
actions: 'build'
configuration: Release
sdk: macosx12.0
xcWorkspacePath: 'build.release/RyzomCore.xcodeproj'
scheme: 'ALL_BUILD'
packageApp: false
#- task: PublishPipelineArtifact@1
# inputs:
# targetPath: build.release/bin/
# artifactName: RyzomClientMacOS11Release

@ -39,8 +39,8 @@
#cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}" #cmakedefine RYZOM_CLIENT_PATCH_URL "${RYZOM_CLIENT_PATCH_URL}"
#cmakedefine RYZOM_CLIENT_APP_NAME "${RYZOM_CLIENT_APP_NAME}" #cmakedefine RYZOM_CLIENT_APP_NAME "${RYZOM_CLIENT_APP_NAME}"
#cmakedefine RYZOM_CLIENT_RELEASENOTES_RING_URL "${RYZOM_CLIENT_RELEASENOTES_RING_URL}" #cmakedefine RYZOM_WEBIG_MAIN_URL "${RYZOM_WEBIG_MAIN_URL}"
#cmakedefine RYZOM_CLIENT_RELEASENOTES_URL "${RYZOM_CLIENT_RELEASENOTES_URL}" #cmakedefine RYZOM_WEBIG_TRUSTED_DOMAIN "${RYZOM_WEBIG_TRUSTED_DOMAIN}"
#cmakedefine AUTHOR "${AUTHOR}" #cmakedefine AUTHOR "${AUTHOR}"
#cmakedefine YEAR "${YEAR}" #cmakedefine YEAR "${YEAR}"

@ -32,9 +32,9 @@ parse_version()
export $VAR=$V export $VAR=$V
} }
parse_version NL $VERSION_FILE VERSION_MAJOR parse_version RYZOM $VERSION_FILE VERSION_MAJOR
parse_version NL $VERSION_FILE VERSION_MINOR parse_version RYZOM $VERSION_FILE VERSION_MINOR
parse_version NL $VERSION_FILE VERSION_PATCH parse_version RYZOM $VERSION_FILE VERSION_PATCH
VERSION=$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH VERSION=$VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH

@ -1,120 +1,120 @@
;-------------------------------- ;--------------------------------
;Include Modern UI ;Include Modern UI
!include "MUI2.nsh" !include "MUI2.nsh"
;-------------------------------- ;--------------------------------
;General ;General
!define Company "Winch Gate" !define Company "Winch Gate"
!define GenericProduct "Ryzom" !define GenericProduct "Ryzom"
!define Product "Ryzom Installer" !define Product "Ryzom Installer"
!define RegistryCat "HKCU" !define RegistryCat "HKCU"
!define RegistryKey "Software\${Company}\${GenericProduct}" !define RegistryKey "Software\${Company}\${GenericProduct}"
!define Executable "ryzom_installer_qt_r.exe" !define Executable "ryzom_installer_qt_r.exe"
!define SrcDir "RyzomInstaller" !define SrcDir "RyzomInstaller"
!define Installer "ryzom_installer_windows.exe" !define Installer "ryzom_installer_windows.exe"
;Properly display all languages (Installer will not work on Windows 95, 98 or ME!) ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!)
;Unicode true ;Unicode true
;New XP style ;New XP style
XPStyle on XPStyle on
;Name and file ;Name and file
Name "${Product}" Name "${Product}"
OutFile "${Installer}" OutFile "${Installer}"
;Default installation folder ;Default installation folder
InstallDir "$LOCALAPPDATA\${GenericProduct}" InstallDir "$LOCALAPPDATA\${GenericProduct}"
;Get installation folder from registry if available ;Get installation folder from registry if available
InstallDirRegKey "${RegistryCat}" "${RegistryKey}" "${GenericProduct} Install Path" InstallDirRegKey "${RegistryCat}" "${RegistryKey}" "${GenericProduct} Install Path"
;Request application privileges for Windows Vista ;Request application privileges for Windows Vista
RequestExecutionLevel user RequestExecutionLevel user
;Best compression ;Best compression
SetCompressor LZMA SetCompressor LZMA
; ??? ; ???
AllowSkipFiles on AllowSkipFiles on
;-------------------------------- ;--------------------------------
;Interface Settings ;Interface Settings
!define MUI_ICON "${SrcDir}\${GenericProduct}.ico" !define MUI_ICON "${SrcDir}\${GenericProduct}.ico"
!define MUI_UNICON "${SrcDir}\${GenericProduct}.ico" !define MUI_UNICON "${SrcDir}\${GenericProduct}.ico"
!define MUI_HEADERIMAGE !define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "modern-header.bmp" ; optional !define MUI_HEADERIMAGE_BITMAP "modern-header.bmp" ; optional
!define MUI_WELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp" !define MUI_WELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp"
!define MUI_ABORTWARNING !define MUI_ABORTWARNING
;Show all languages, despite user's codepage ;Show all languages, despite user's codepage
!define MUI_LANGDLL_ALLLANGUAGES !define MUI_LANGDLL_ALLLANGUAGES
;-------------------------------- ;--------------------------------
;Language Selection Dialog Settings ;Language Selection Dialog Settings
;Remember the installer language ;Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT "${RegistryCat}" !define MUI_LANGDLL_REGISTRY_ROOT "${RegistryCat}"
!define MUI_LANGDLL_REGISTRY_KEY "${RegistryKey}" !define MUI_LANGDLL_REGISTRY_KEY "${RegistryKey}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "Language" !define MUI_LANGDLL_REGISTRY_VALUENAME "Language"
;-------------------------------- ;--------------------------------
;Pages ;Pages
!insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "$INSTDIR\${Executable}" !define MUI_FINISHPAGE_RUN "$INSTDIR\${Executable}"
!insertmacro MUI_PAGE_FINISH !insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH !insertmacro MUI_UNPAGE_FINISH
;-------------------------------- ;--------------------------------
;Languages ;Languages
!insertmacro MUI_LANGUAGE "English" ;first language is the default language !insertmacro MUI_LANGUAGE "English" ;first language is the default language
!insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "German"
!insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "Spanish"
;-------------------------------- ;--------------------------------
;Reserve Files ;Reserve Files
;If you are using solid compression, files that are required before ;If you are using solid compression, files that are required before
;the actual installation should be stored first in the data block, ;the actual installation should be stored first in the data block,
;because this will make your installer start faster. ;because this will make your installer start faster.
!insertmacro MUI_RESERVEFILE_LANGDLL !insertmacro MUI_RESERVEFILE_LANGDLL
;-------------------------------- ;--------------------------------
;Installer Sections ;Installer Sections
; ---------------------------------------- ; ----------------------------------------
; Default section ; Default section
Section Section
SetOutPath "$INSTDIR" SetOutPath "$INSTDIR"
;Client, configuration and misc files ;Client, configuration and misc files
File "${SrcDir}\${Executable}" File "${SrcDir}\${Executable}"
File "${SrcDir}\msvcp120.dll" File "${SrcDir}\msvcp120.dll"
File "${SrcDir}\msvcr120.dll" File "${SrcDir}\msvcr120.dll"
;Shortcut on desktop ;Shortcut on desktop
CreateShortCut "$DESKTOP\${Product}.lnk" "$INSTDIR\${Executable}" CreateShortCut "$DESKTOP\${Product}.lnk" "$INSTDIR\${Executable}"
;Store installation folder ;Store installation folder
WriteRegStr "${RegistryCat}" "${RegistryKey}" "${GenericProduct} Install Path" $INSTDIR WriteRegStr "${RegistryCat}" "${RegistryKey}" "${GenericProduct} Install Path" $INSTDIR
SectionEnd SectionEnd
;-------------------------------- ;--------------------------------
;Installer Functions ;Installer Functions
Function .onInit Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd FunctionEnd

@ -1,298 +1,298 @@
;-------------------------------- ;--------------------------------
;Include Modern UI ;Include Modern UI
!include "MUI2.nsh" !include "MUI2.nsh"
;-------------------------------- ;--------------------------------
;General ;General
!define Company "Nevrax" !define Company "Nevrax"
!define Product "Ryzom" !define Product "Ryzom"
!define Version "2.1.0" !define Version "2.1.0"
!define Patch "661" !define Patch "661"
!define RegistryCat "HKLM" !define RegistryCat "HKLM"
!define RegistryKey "Software\${Company}\${Product}" !define RegistryKey "Software\${Company}\${Product}"
!define Executable "client_ryzom_rd.exe" !define Executable "client_ryzom_rd.exe"
!define DstDir "Output" !define DstDir "Output"
!define SrcDir "Ryzom" !define SrcDir "Ryzom"
!define Installer "ryzom_setup_${Patch}.exe" !define Installer "ryzom_setup_${Patch}.exe"
;Registry key for uninstaller ;Registry key for uninstaller
!define UninstallRegistryRoot "Software\Microsoft\Windows\CurrentVersion\Uninstall" !define UninstallRegistryRoot "Software\Microsoft\Windows\CurrentVersion\Uninstall"
!define UninstallRegistryKey "${UninstallRegistryRoot}\${Product}" !define UninstallRegistryKey "${UninstallRegistryRoot}\${Product}"
;Properly display all languages (Installer will not work on Windows 95, 98 or ME!) ;Properly display all languages (Installer will not work on Windows 95, 98 or ME!)
Unicode true Unicode true
;New XP style ;New XP style
XPStyle on XPStyle on
;Name and file ;Name and file
Name "${Product}" Name "${Product}"
OutFile "${DstDir}\${Installer}" OutFile "${DstDir}\${Installer}"
;Default installation folder ;Default installation folder
InstallDir "$PROGRAMFILES\${Product}" InstallDir "$PROGRAMFILES\${Product}"
;Get installation folder from registry if available ;Get installation folder from registry if available
InstallDirRegKey "${RegistryCat}" "${RegistryKey}" "${Product} Install Path" InstallDirRegKey "${RegistryCat}" "${RegistryKey}" "${Product} Install Path"
;Request application privileges for Windows Vista ;Request application privileges for Windows Vista
RequestExecutionLevel admin RequestExecutionLevel admin
;Best compression ;Best compression
SetCompressor LZMA SetCompressor LZMA
; ??? ; ???
AllowSkipFiles on AllowSkipFiles on
;-------------------------------- ;--------------------------------
;Variables ;Variables
;Will be used later ;Will be used later
Var MUI_TEMP Var MUI_TEMP
Var STARTMENU_FOLDER Var STARTMENU_FOLDER
;-------------------------------- ;--------------------------------
;Interface Settings ;Interface Settings
!define MUI_ICON "${SrcDir}\ryzom.ico" !define MUI_ICON "${SrcDir}\ryzom.ico"
!define MUI_UNICON "${SrcDir}\ryzom.ico" !define MUI_UNICON "${SrcDir}\ryzom.ico"
!define MUI_HEADERIMAGE !define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "modern-header.bmp" ; optional !define MUI_HEADERIMAGE_BITMAP "modern-header.bmp" ; optional
!define MUI_WELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp" !define MUI_WELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "modern-wizard.bmp"
!define MUI_ABORTWARNING !define MUI_ABORTWARNING
;Show all languages, despite user's codepage ;Show all languages, despite user's codepage
!define MUI_LANGDLL_ALLLANGUAGES !define MUI_LANGDLL_ALLLANGUAGES
;-------------------------------- ;--------------------------------
;Language Selection Dialog Settings ;Language Selection Dialog Settings
;Remember the installer language ;Remember the installer language
!define MUI_LANGDLL_REGISTRY_ROOT "${RegistryCat}" !define MUI_LANGDLL_REGISTRY_ROOT "${RegistryCat}"
!define MUI_LANGDLL_REGISTRY_KEY "${RegistryKey}" !define MUI_LANGDLL_REGISTRY_KEY "${RegistryKey}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "Language" !define MUI_LANGDLL_REGISTRY_VALUENAME "Language"
;-------------------------------- ;--------------------------------
;Pages ;Pages
!insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_DIRECTORY
;Start Menu Folder Page Configuration ;Start Menu Folder Page Configuration
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${RegistryCat}" !define MUI_STARTMENUPAGE_REGISTRY_ROOT "${RegistryCat}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${RegistryKey}" !define MUI_STARTMENUPAGE_REGISTRY_KEY "${RegistryKey}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
!insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "$INSTDIR\${Executable}" !define MUI_FINISHPAGE_RUN "$INSTDIR\${Executable}"
!insertmacro MUI_PAGE_FINISH !insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_WELCOME !insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH !insertmacro MUI_UNPAGE_FINISH
;-------------------------------- ;--------------------------------
;Languages ;Languages
!insertmacro MUI_LANGUAGE "English" ;first language is the default language !insertmacro MUI_LANGUAGE "English" ;first language is the default language
!insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "German"
;!insertmacro MUI_LANGUAGE "Spanish" ;!insertmacro MUI_LANGUAGE "Spanish"
;-------------------------------- ;--------------------------------
;Reserve Files ;Reserve Files
;If you are using solid compression, files that are required before ;If you are using solid compression, files that are required before
;the actual installation should be stored first in the data block, ;the actual installation should be stored first in the data block,
;because this will make your installer start faster. ;because this will make your installer start faster.
!insertmacro MUI_RESERVEFILE_LANGDLL !insertmacro MUI_RESERVEFILE_LANGDLL
;-------------------------------- ;--------------------------------
;Descriptions ;Descriptions
;French ;French
LangString MSG_SUPPORT_URL_TITLE ${LANG_FRENCH} "Support" LangString MSG_SUPPORT_URL_TITLE ${LANG_FRENCH} "Support"
LangString MSG_SUPPORT_URL ${LANG_FRENCH} "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=fr#1" LangString MSG_SUPPORT_URL ${LANG_FRENCH} "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=fr#1"
LangString MSG_HOME_URL_TITLE ${LANG_FRENCH} "${Product} sur le Web" LangString MSG_HOME_URL_TITLE ${LANG_FRENCH} "${Product} sur le Web"
LangString MSG_HOME_URL ${LANG_FRENCH} "http://ryzom.fr" LangString MSG_HOME_URL ${LANG_FRENCH} "http://ryzom.fr"
LangString MSG_CONFIRM_DELETE_BACKUPS ${LANG_FRENCH} "Voulez-vous supprimer vos fichiers de sauvegarde ? Appuyer sur Oui pour effacer vos fichiers de sauvegarde." LangString MSG_CONFIRM_DELETE_BACKUPS ${LANG_FRENCH} "Voulez-vous supprimer vos fichiers de sauvegarde ? Appuyer sur Oui pour effacer vos fichiers de sauvegarde."
;English ;English
LangString MSG_SUPPORT_URL_TITLE ${LANG_ENGLISH} "Support" LangString MSG_SUPPORT_URL_TITLE ${LANG_ENGLISH} "Support"
LangString MSG_SUPPORT_URL ${LANG_ENGLISH} "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=en#1" LangString MSG_SUPPORT_URL ${LANG_ENGLISH} "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=en#1"
LangString MSG_HOME_URL_TITLE ${LANG_ENGLISH} "${Product} on the Web" LangString MSG_HOME_URL_TITLE ${LANG_ENGLISH} "${Product} on the Web"
LangString MSG_HOME_URL ${LANG_ENGLISH} "http://ryzom.com" LangString MSG_HOME_URL ${LANG_ENGLISH} "http://ryzom.com"
LangString MSG_CONFIRM_DELETE_BACKUPS ${LANG_ENGLISH} "Deleting Save Files? Click Yes to delete your own save files." LangString MSG_CONFIRM_DELETE_BACKUPS ${LANG_ENGLISH} "Deleting Save Files? Click Yes to delete your own save files."
;German ;German
LangString MSG_SUPPORT_URL_TITLE ${LANG_GERMAN} "Support" LangString MSG_SUPPORT_URL_TITLE ${LANG_GERMAN} "Support"
LangString MSG_SUPPORT_URL ${LANG_GERMAN} "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=de#1" LangString MSG_SUPPORT_URL ${LANG_GERMAN} "http://app.ryzom.com/app_forum/index.php?page=topic/view/22047/1&post149889=de#1"
LangString MSG_HOME_URL_TITLE ${LANG_GERMAN} "${Product} im Internet" LangString MSG_HOME_URL_TITLE ${LANG_GERMAN} "${Product} im Internet"
LangString MSG_HOME_URL ${LANG_GERMAN} "http://ryzom.de" LangString MSG_HOME_URL ${LANG_GERMAN} "http://ryzom.de"
LangString MSG_CONFIRM_DELETE_BACKUPS ${LANG_GERMAN} "Gespeicherte Dateien löschen? Klicke Ja um die eigenen Dateien zu löschen." LangString MSG_CONFIRM_DELETE_BACKUPS ${LANG_GERMAN} "Gespeicherte Dateien löschen? Klicke Ja um die eigenen Dateien zu löschen."
;-------------------------------- ;--------------------------------
;Installer Sections ;Installer Sections
!macro CreateInternetShortcut FILENAME URL ICONFILE !macro CreateInternetShortcut FILENAME URL ICONFILE
WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}" WriteINIStr "${FILENAME}.url" "InternetShortcut" "URL" "${URL}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconFile" "${ICONFILE}" WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconFile" "${ICONFILE}"
WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconIndex" "0" WriteINIStr "${FILENAME}.url" "InternetShortcut" "IconIndex" "0"
!macroend !macroend
; ---------------------------------------- ; ----------------------------------------
; Default section ; Default section
Section Section
;Install for All Users ;Install for All Users
SetShellVarContext all SetShellVarContext all
;Game directories ;Game directories
SetOutPath "$INSTDIR\cfg" SetOutPath "$INSTDIR\cfg"
File /r "${SrcDir}\cfg\*.*" File /r "${SrcDir}\cfg\*.*"
SetOutPath "$INSTDIR\data" SetOutPath "$INSTDIR\data"
File /r "${SrcDir}\data\*.*" File /r "${SrcDir}\data\*.*"
SetOutPath "$INSTDIR\examples" SetOutPath "$INSTDIR\examples"
File /r "${SrcDir}\examples\*.*" File /r "${SrcDir}\examples\*.*"
SetOutPath "$INSTDIR\user" SetOutPath "$INSTDIR\user"
File /r "${SrcDir}\user\*.*" File /r "${SrcDir}\user\*.*"
SetOutPath "$INSTDIR" SetOutPath "$INSTDIR"
;Client, configuration and misc files ;Client, configuration and misc files
File "${SrcDir}\client_default.cfg" File "${SrcDir}\client_default.cfg"
File "${SrcDir}\${Executable}" File "${SrcDir}\${Executable}"
File "${SrcDir}\configure.bat" File "${SrcDir}\configure.bat"
File "${SrcDir}\d3dcompiler_43.dll" File "${SrcDir}\d3dcompiler_43.dll"
File "${SrcDir}\d3dx9_43.dll" File "${SrcDir}\d3dx9_43.dll"
File "${SrcDir}\fmod.dll" File "${SrcDir}\fmod.dll"
File "${SrcDir}\forum.url" File "${SrcDir}\forum.url"
File "${SrcDir}\launch.bat" File "${SrcDir}\launch.bat"
File "${SrcDir}\msvcp100.dll" File "${SrcDir}\msvcp100.dll"
File "${SrcDir}\msvcr100.dll" File "${SrcDir}\msvcr100.dll"
File "${SrcDir}\nel_drv_direct3d_win_r.dll" File "${SrcDir}\nel_drv_direct3d_win_r.dll"
File "${SrcDir}\nel_drv_fmod_win_r.dll" File "${SrcDir}\nel_drv_fmod_win_r.dll"
File "${SrcDir}\nel_drv_opengl_win_r.dll" File "${SrcDir}\nel_drv_opengl_win_r.dll"
File "${SrcDir}\ryzom.ico" File "${SrcDir}\ryzom.ico"
File "${SrcDir}\ryzom.url" File "${SrcDir}\ryzom.url"
File "${SrcDir}\Ryzom6.ico" File "${SrcDir}\Ryzom6.ico"
;Create uninstaller ;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe" WriteUninstaller "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;Create shortcuts in Start Menu ;Create shortcuts in Start Menu
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${Product}.lnk" "$INSTDIR\${Executable}" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\${Product}.lnk" "$INSTDIR\${Executable}"
;Create URLs ;Create URLs
!insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\$(MSG_SUPPORT_URL_TITLE)" "$(MSG_SUPPORT_URL)" "$INSTDIR\ryzom.ico" !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\$(MSG_SUPPORT_URL_TITLE)" "$(MSG_SUPPORT_URL)" "$INSTDIR\ryzom.ico"
!insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\$(MSG_HOME_URL_TITLE)" "$(MSG_HOME_URL)" "$INSTDIR\ryzom.ico" !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\$(MSG_HOME_URL_TITLE)" "$(MSG_HOME_URL)" "$INSTDIR\ryzom.ico"
!insertmacro MUI_STARTMENU_WRITE_END !insertmacro MUI_STARTMENU_WRITE_END
;Shortcut on desktop ;Shortcut on desktop
CreateShortCut "$DESKTOP\${Product}.lnk" "$INSTDIR\${Executable}" CreateShortCut "$DESKTOP\${Product}.lnk" "$INSTDIR\${Executable}"
;Add/Remove Program entry ;Add/Remove Program entry
WriteRegStr HKLM "${UninstallRegistryKey}" "DisplayIcon" "$INSTDIR\${Executable},0" WriteRegStr HKLM "${UninstallRegistryKey}" "DisplayIcon" "$INSTDIR\${Executable},0"
WriteRegStr HKLM "${UninstallRegistryKey}" "DisplayName" "${Product}" WriteRegStr HKLM "${UninstallRegistryKey}" "DisplayName" "${Product}"
WriteRegStr HKLM "${UninstallRegistryKey}" "DisplayVersion" "${Version}" WriteRegStr HKLM "${UninstallRegistryKey}" "DisplayVersion" "${Version}"
WriteRegStr HKLM "${UninstallRegistryKey}" "InstallLocation" "$INSTDIR" WriteRegStr HKLM "${UninstallRegistryKey}" "InstallLocation" "$INSTDIR"
WriteRegStr HKLM "${UninstallRegistryKey}" "QuietUninstallString" '"$INSTDIR\Uninstall.exe" /S' WriteRegStr HKLM "${UninstallRegistryKey}" "QuietUninstallString" '"$INSTDIR\Uninstall.exe" /S'
WriteRegStr HKLM "${UninstallRegistryKey}" "UninstallString" "$INSTDIR\Uninstall.exe" WriteRegStr HKLM "${UninstallRegistryKey}" "UninstallString" "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "${UninstallRegistryKey}" "Publisher" "${Company}" WriteRegStr HKLM "${UninstallRegistryKey}" "Publisher" "${Company}"
WriteRegStr HKLM "${UninstallRegistryKey}" "HelpLink" "$(MSG_SUPPORT_URL)" WriteRegStr HKLM "${UninstallRegistryKey}" "HelpLink" "$(MSG_SUPPORT_URL)"
WriteRegStr HKLM "${UninstallRegistryKey}" "URLInfoAbout" "$(MSG_HOME_URL)" WriteRegStr HKLM "${UninstallRegistryKey}" "URLInfoAbout" "$(MSG_HOME_URL)"
;Store installation folder ;Store installation folder
WriteRegStr "${RegistryCat}" "${RegistryKey}" "${Product} Install Path" $INSTDIR WriteRegStr "${RegistryCat}" "${RegistryKey}" "${Product} Install Path" $INSTDIR
SectionEnd SectionEnd
;-------------------------------- ;--------------------------------
;Uninstaller Section ;Uninstaller Section
Section "Uninstall" Section "Uninstall"
;Install for All Users ;Install for All Users
SetShellVarContext all SetShellVarContext all
;Game directories ;Game directories
RMDir /r "$INSTDIR\cfg" RMDir /r "$INSTDIR\cfg"
RMDir /r "$INSTDIR\data" RMDir /r "$INSTDIR\data"
RMDir /r "$INSTDIR\examples" RMDir /r "$INSTDIR\examples"
;Temporary directories ;Temporary directories
RMDir /r "$INSTDIR\cache" RMDir /r "$INSTDIR\cache"
RMDir /r "$INSTDIR\unpack" RMDir /r "$INSTDIR\unpack"
;Client, configuration and misc files ;Client, configuration and misc files
Delete "$INSTDIR\client_default.cfg" Delete "$INSTDIR\client_default.cfg"
Delete "$INSTDIR\${Executable}" Delete "$INSTDIR\${Executable}"
Delete "$INSTDIR\configure.bat" Delete "$INSTDIR\configure.bat"
Delete "$INSTDIR\d3dcompiler_43.dll" Delete "$INSTDIR\d3dcompiler_43.dll"
Delete "$INSTDIR\d3dx9_43.dll" Delete "$INSTDIR\d3dx9_43.dll"
Delete "$INSTDIR\fmod.dll" Delete "$INSTDIR\fmod.dll"
Delete "$INSTDIR\forum.url" Delete "$INSTDIR\forum.url"
Delete "$INSTDIR\launch.bat" Delete "$INSTDIR\launch.bat"
Delete "$INSTDIR\msvcp100.dll" Delete "$INSTDIR\msvcp100.dll"
Delete "$INSTDIR\msvcr100.dll" Delete "$INSTDIR\msvcr100.dll"
Delete "$INSTDIR\nel_drv_direct3d_win_r.dll" Delete "$INSTDIR\nel_drv_direct3d_win_r.dll"
Delete "$INSTDIR\nel_drv_fmod_win_r.dll" Delete "$INSTDIR\nel_drv_fmod_win_r.dll"
Delete "$INSTDIR\nel_drv_opengl_win_r.dll" Delete "$INSTDIR\nel_drv_opengl_win_r.dll"
Delete "$INSTDIR\ryzom.ico" Delete "$INSTDIR\ryzom.ico"
Delete "$INSTDIR\ryzom.url" Delete "$INSTDIR\ryzom.url"
Delete "$INSTDIR\Ryzom6.ico" Delete "$INSTDIR\Ryzom6.ico"
;Delete uninstaller ;Delete uninstaller
Delete "$INSTDIR\Uninstall.exe" Delete "$INSTDIR\Uninstall.exe"
MessageBox MB_YESNO "$(MSG_CONFIRM_DELETE_BACKUPS)" IDNO DontDeleteMiscFiles MessageBox MB_YESNO "$(MSG_CONFIRM_DELETE_BACKUPS)" IDNO DontDeleteMiscFiles
;Delete directory ;Delete directory
RMDir /r "$INSTDIR" RMDir /r "$INSTDIR"
DontDeleteMiscFiles: DontDeleteMiscFiles:
;Delete directory if empty ;Delete directory if empty
RMDir "$INSTDIR" RMDir "$INSTDIR"
;Delete all shortcuts ;Delete all shortcuts
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
;Delete Start Menu shortcuts ;Delete Start Menu shortcuts
Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\${Product}.lnk" Delete "$SMPROGRAMS\$MUI_TEMP\${Product}.lnk"
Delete "$SMPROGRAMS\$MUI_TEMP\$(MSG_HOME_URL_TITLE).url" Delete "$SMPROGRAMS\$MUI_TEMP\$(MSG_HOME_URL_TITLE).url"
Delete "$SMPROGRAMS\$MUI_TEMP\$(MSG_SUPPORT_URL_TITLE).url" Delete "$SMPROGRAMS\$MUI_TEMP\$(MSG_SUPPORT_URL_TITLE).url"
RMDir /r /REBOOTOK "$SMPROGRAMS\$MUI_TEMP" RMDir /r /REBOOTOK "$SMPROGRAMS\$MUI_TEMP"
;Delete desktop shortcut ;Delete desktop shortcut
Delete "$DESKTOP\${Product}.lnk" Delete "$DESKTOP\${Product}.lnk"
;Delete registry ;Delete registry
DeleteRegKey /ifempty "${RegistryCat}" "${RegistryKey}" DeleteRegKey /ifempty "${RegistryCat}" "${RegistryKey}"
DeleteRegKey "${RegistryCat}" "${UninstallRegistryKey}" DeleteRegKey "${RegistryCat}" "${UninstallRegistryKey}"
SectionEnd SectionEnd
;-------------------------------- ;--------------------------------
;Installer Functions ;Installer Functions
Function .onInit Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd FunctionEnd
;-------------------------------- ;--------------------------------
;Uninstaller Functions ;Uninstaller Functions
Function un.onInit Function un.onInit
!insertmacro MUI_UNGETLANGUAGE !insertmacro MUI_UNGETLANGUAGE
FunctionEnd FunctionEnd

@ -10,17 +10,25 @@ IF(WIN32)
ENDIF() ENDIF()
IF(WITH_3D) IF(WITH_3D)
FIND_PACKAGE(FreeType) IF(HUNTER_ENABLED)
HUNTER_ADD_PACKAGE(freetype)
FIND_PACKAGE(freetype CONFIG REQUIRED)
SET(FREETYPE_LIBRARIES freetype::freetype)
ELSE()
FIND_PACKAGE(FreeType)
ENDIF() #hunter
IF(WITH_NEL_CEGUI) IF(WITH_NEL_CEGUI)
FIND_PACKAGE(CEGUI) FIND_PACKAGE(CEGUI)
ENDIF() ENDIF()
ENDIF() ENDIF()
IF(WITH_SOUND) IF(WITH_SOUND AND NOT HUNTER_ENABLED)
FIND_PACKAGE(Ogg) FIND_PACKAGE(Ogg)
FIND_PACKAGE(Vorbis) FIND_PACKAGE(Vorbis)
FIND_PACKAGE(FFmpeg COMPONENTS AVCODEC AVFORMAT AVUTIL SWRESAMPLE) IF(WITH_FFMPEG)
FIND_PACKAGE(FFmpeg REQUIRED COMPONENTS AVCODEC AVFORMAT AVUTIL SWRESAMPLE)
ENDIF()
IF(WITH_DRIVER_OPENAL) IF(WITH_DRIVER_OPENAL)
FIND_PACKAGE(OpenAL) FIND_PACKAGE(OpenAL)

@ -0,0 +1,83 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2019 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CL_CSS_BACKGROUND_H
#define CL_CSS_BACKGROUND_H
#include "nel/misc/types_nl.h"
#include "nel/misc/rgba.h"
#include "nel/gui/css_types.h"
#include "nel/gui/css_length.h"
namespace NLGUI
{
/**
* \brief CSS background info
* \date 2021-07-02 11:36 GMT
* \author Meelis Mägi (Nimetu)
*/
class CSSBackground
{
public:
CSSBackground()
:color(NLMISC::CRGBA::Transparent),
repeatX(CSS_VALUE_REPEAT), repeatY(CSS_VALUE_REPEAT), attachment(CSS_VALUE_SCROLL),
xAnchor(CSS_VALUE_LEFT), yAnchor(CSS_VALUE_TOP),
clip(CSS_VALUE_BORDER_BOX), origin(CSS_VALUE_PADDING_BOX), size(CSS_VALUE_AUTO)
{}
void setImage(const std::string &value);
void setPosition(const std::string &value);
void setSize(const std::string &value);
void setRepeat(const std::string &value);
void setOrigin(const std::string &value);
void setClip(const std::string &value);
void setAttachment(const std::string &value);
void setColor(const std::string &value);
public:
// TODO: only final layer has color
NLMISC::CRGBA color;
std::string image;
CSSValueType repeatX;
CSSValueType repeatY;
CSSValueType attachment;
CSSValueType xAnchor;
CSSValueType yAnchor;
CSSLength xPosition;
CSSLength yPosition;
CSSValueType clip;
CSSValueType origin;
CSSValueType size;
CSSLength width;
CSSLength height;
private:
void positionFromOne(const std::vector<std::string> &parts);
void positionFromTwo(const std::vector<std::string> &parts);
void positionFromThree(const std::vector<std::string> &parts);
void positionFromFour(const std::vector<std::string> &parts);
};
}//namespace
#endif // CL_CSS_BACKGROUND_H

@ -0,0 +1,193 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2019 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_CSS_BACKGROUND_RENDERER_H
#define NL_CSS_BACKGROUND_RENDERER_H
#include "nel/misc/types_nl.h"
#include "nel/misc/rgba.h"
#include "nel/misc/geom_ext.h"
#include "nel/gui/css_types.h"
#include "nel/gui/css_background.h"
namespace NLGUI
{
class CInterfaceElement;
/**
* \brief Border renderer for GUI classes
* \date 2021-06-29 15:17 GMT
* \author Meelis Mägi (Nimetu)
*/
class CSSBackgroundRenderer
{
public:
// alpha value from parent
uint8 CurrentAlpha;
// TODO: should be moved to CSSBackground
sint32 TextureId;
public:
CSSBackgroundRenderer();
~CSSBackgroundRenderer();
// return true if no background is set
bool isEmpty() const
{
return m_Background.image.empty() && m_Background.color.A == 0;
}
void setModulateGlobalColor(bool m) { m_ModulateGlobalColor = m; }
void updateCoords();
void invalidateCoords() { m_Dirty = true; }
void invalidateContent() { m_Dirty = true; };
void clear();
void setBackground(const CSSBackground &bg);
// helper function to change background image
void setImage(const std::string &bgtex);
void setImageRepeat(bool b);
void setImageCover(bool b);
// helper function to change background color
void setColor(const NLMISC::CRGBA &color)
{
m_Dirty = true;
m_Background.color = color;
}
NLMISC::CRGBA getColor() const
{
return m_Background.color;
}
// override painting area to be at least the size of viewport (ie, <html> background)
void setFillViewport(bool b) {
m_Dirty = true;
m_FillViewport = b;
}
void setViewport(CInterfaceElement *root)
{
m_Dirty = true;
m_Viewport = root;
}
void setBorderArea(sint32 x, sint32 y, sint32 w, sint32 h)
{
m_Dirty = true;
m_BorderX = x;
m_BorderY = y;
m_BorderW = w;
m_BorderH = h;
}
void setPaddingArea(sint32 x, sint32 y, sint32 w, sint32 h)
{
m_Dirty = true;
m_PaddingX = x;
m_PaddingY = y;
m_PaddingW = w;
m_PaddingH = h;
}
void setContentArea(sint32 x, sint32 y, sint32 w, sint32 h)
{
m_Dirty = true;
m_ContentX = x;
m_ContentY = y;
m_ContentW = w;
m_ContentH = h;
}
// sizes for em, rem units
void setFontSize(float rootFontSize, float fontSize)
{
m_Dirty = true;
m_RootFontSize = rootFontSize;
m_FontSize = fontSize;
}
void draw();
private:
sint32 m_BorderX, m_BorderY, m_BorderW, m_BorderH;
sint32 m_PaddingX, m_PaddingY, m_PaddingW, m_PaddingH;
sint32 m_ContentX, m_ContentY, m_ContentW, m_ContentH;
// font size for 'rem'
float m_RootFontSize;
// font size for 'em'
float m_FontSize;
// viewport element for vw,wh,vmin,vmax
CInterfaceElement* m_Viewport;
struct SDrawQueue
{
sint32 TextureId;
NLMISC::CQuadUV Quad;
NLMISC::CRGBA Color;
};
std::vector<SDrawQueue> m_DrawQueue;
const sint8 m_RenderLayer;
bool m_ModulateGlobalColor;
// if true, painting area returns area at least the size of viewport (ie, <html> background)
bool m_FillViewport;
// if true, then updateCoords() is called from draw()
bool m_Dirty;
CSSBackground m_Background;
// get clip area based on background-clip
void getPaintingArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const;
// get positioning area based on background-origin
void getPositioningArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const;
// calculate image size based on background-size
void calculateSize(const CSSBackground &bg, sint32 &texW, sint32 &texH) const;
// calculate image position based on background-position
void calculatePosition(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH) const;
// calculate image tile position, size, count, and spacing based on background-repeat
void calculateTiles(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH, sint32 &tilesX, sint32 &tilesY, sint32 &spacingX, sint32 &spacingY) const;
// position, size, and count for first tile to cover an area
void getImageTile(sint32 &tilePos, sint32 &tileSize, sint32 &spacing, sint32 &tiles, sint32 areaPos, sint32 areaSize, CSSValueType repeat) const;
// push background color to draw queue
void buildColorQuads(const CSSBackground &bg);
// push background image to draw quque
void buildImageQuads(const CSSBackground &bg, sint32 textureId);
}; // CSSBackgroundRenderer
}//namespace
#endif // NL_CSS_BACKGROUND_RENDERER_H

@ -0,0 +1,72 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2019 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CL_CSS_BORDER_H
#define CL_CSS_BORDER_H
#include "nel/misc/types_nl.h"
#include "nel/misc/rgba.h"
#include "nel/gui/css_types.h"
#include "nel/gui/css_length.h"
namespace NLGUI
{
/**
* \brief CSS border info
* \date 2021-07-23 09:51 GMT
* \author Meelis Mägi (Nimetu)
*/
class CSSBorder
{
public:
CSSBorder()
{
reset();
}
CSSBorder(uint width, CSSLineStyle style, NLMISC::CRGBA color)
{
set(width, style, color);
}
void reset()
{
set(CSS_LINE_WIDTH_MEDIUM, CSS_LINE_STYLE_NONE, NLMISC::CRGBA::Transparent);
}
void set(uint width, CSSLineStyle style, NLMISC::CRGBA color)
{
Width.setFloatValue(width, "px");
Style = style;
Color = color;
}
bool empty() const
{
return Style == CSS_LINE_STYLE_NONE || Style == CSS_LINE_STYLE_HIDDEN
|| Width.getFloat() == 0;
}
CSSLength Width;
CSSLineStyle Style;
NLMISC::CRGBA Color;
};
}//namespace
#endif // CL_CSS_BORDER_H

@ -23,9 +23,12 @@
#include "nel/misc/rgba.h" #include "nel/misc/rgba.h"
#include "nel/misc/geom_ext.h" #include "nel/misc/geom_ext.h"
#include "nel/gui/css_types.h" #include "nel/gui/css_types.h"
#include "nel/gui/css_border.h"
namespace NLGUI namespace NLGUI
{ {
class CInterfaceElement;
/** /**
* \brief Border renderer for GUI classes * \brief Border renderer for GUI classes
* \date 2019-09-03 10:50 GMT * \date 2019-09-03 10:50 GMT
@ -34,29 +37,76 @@ namespace NLGUI
class CSSBorderRenderer class CSSBorderRenderer
{ {
private: private:
enum EBorderSide
{
BORDER_TOP_LEFT = 0,
BORDER_TOP_RIGHT,
BORDER_BOTTOM_LEFT,
BORDER_BOTTOM_RIGHT,
BORDER_LEFT_TOP,
BORDER_RIGHT_TOP,
BORDER_LEFT_BOTTOM,
BORDER_RIGHT_BOTTOM,
BORDER_TOP,
BORDER_RIGHT,
BORDER_BOTTOM,
BORDER_LEFT,
BORDER_INVALID
};
// parent element screen coordinates // parent element screen coordinates
sint32 _XReal, _YReal; sint32 m_XReal, m_YReal;
sint32 _WReal, _HReal; sint32 m_WReal, m_HReal;
NLMISC::CQuadUV _QuadT; struct SDrawBorder
NLMISC::CQuadUV _QuadR; {
NLMISC::CQuadUV _QuadB; NLMISC::CQuadUV Quad;
NLMISC::CQuadUV _QuadL; NLMISC::CRGBA Color;
};
std::vector<SDrawBorder> m_DrawBorders;
uint8 _RenderLayer; sint8 m_RenderLayer;
bool _ModulateGlobalColor; bool m_ModulateGlobalColor;
// if true, then updateCoords() is called from draw() // if true, then updateCoords() is called from draw()
bool _Dirty; bool m_Dirty;
// if true, then at least one border is set // UI scale, used to calculate number of segments to draw for circle
bool _Border; float m_Scale;
bool _BorderTop, _BorderRight, _BorderBottom, _BorderLeft;
public: CSSRect<CSSBorder> m_Border;
uint32 TopWidth, RightWidth, BottomWidth, LeftWidth; CSSRect<sint32> m_Computed;
NLMISC::CRGBA TopColor, RightColor, BottomColor, LeftColor;
CSSLineStyle TopStyle, RightStyle, BottomStyle, LeftStyle; // font size for 'rem'
float m_RootFontSize;
// font size for 'em'
float m_FontSize;
// if true, then CSSLength values are recomputed
bool m_MustComputeValues;
// viewport element for vw,wh,vmin,vmax
CInterfaceElement* m_Viewport;
// update CSSLength values
void computeValues();
void getAdjacentBorders(EBorderSide side, EBorderSide &adjBorderL, EBorderSide &adjBorderR) const;
void getAdjacentBorderWidth(EBorderSide side, sint32 &adjWidthL, sint32 &adjWidthR) const;
// dot
void buildDotCornerStart(EBorderSide side, SDrawBorder shape, float x1, float y1, float radius);
void buildDotCornerEnd(EBorderSide side, SDrawBorder shape, float x1, float y1, float radius);
void buildDotCorner(SDrawBorder shape, float x, float y, float r, const NLMISC::CLine &line);
// draw circle, angle is CCW between 0..1 (3'o'clock being 0deg).
void buildDotSegments(SDrawBorder shape, float x, float y, float radius, float fromAngle=0.f, float toAngle=1.f);
// dash
void makeBorderQuad(EBorderSide side, SDrawBorder &shape, float x, float y, float width, float thickness) const;
void makeCornerQuad(EBorderSide side, SDrawBorder &shape) const;
void buildDashedBorder(EBorderSide side);
void buildSolidBorder(EBorderSide side);
bool hasInnerShape(CSSLineStyle style) const;
public:
// alpha value from parent // alpha value from parent
uint8 CurrentAlpha; uint8 CurrentAlpha;
@ -68,21 +118,67 @@ namespace NLGUI
void setRect(sint32 x, sint32 y, sint32 w, sint32 h); void setRect(sint32 x, sint32 y, sint32 w, sint32 h);
void setWidth(uint32 top, uint32 right, uint32 bottom, uint32 left); void setBorder(const CSSRect<CSSBorder> &b) { m_Dirty = true; m_Border = b; }
void setStyle(CSSLineStyle top, CSSLineStyle right, CSSLineStyle bottom, CSSLineStyle left);
void setColor(const NLMISC::CRGBA &top, const NLMISC::CRGBA &right, const NLMISC::CRGBA &bottom, const NLMISC::CRGBA &left);
void updateCoords(); void updateCoords();
void invalidateCoords() { _Dirty = _Border = true; } void invalidateCoords() { m_Dirty = true; }
void invalidateContent() { _Dirty = _Border = true; }; void invalidateContent() { m_Dirty = true; }
uint32 getTopWidth() const; bool isEmpty() const {
uint32 getRightWidth() const; return (m_Border.Top.Width.getFloat() +
uint32 getBottomWidth() const; m_Border.Right.Width.getFloat() +
uint32 getLeftWidth() const; m_Border.Bottom.Width.getFloat() +
m_Border.Left.Width.getFloat()) == 0;
uint32 getLeftRightWidth() const; }
uint32 getTopBottomWidth() const;
uint32 getTopWidth() { if (m_MustComputeValues) computeValues(); return m_Computed.Top; }
uint32 getRightWidth() { if (m_MustComputeValues) computeValues(); return m_Computed.Right; }
uint32 getBottomWidth() { if (m_MustComputeValues) computeValues(); return m_Computed.Bottom; }
uint32 getLeftWidth() { if (m_MustComputeValues) computeValues(); return m_Computed.Left; }
uint32 getLeftRightWidth() { if (m_MustComputeValues) computeValues(); return m_Computed.Left + m_Computed.Right; }
uint32 getTopBottomWidth() { if (m_MustComputeValues) computeValues(); return m_Computed.Top + m_Computed.Bottom; }
NLMISC::CRGBA getTopColor() const { return m_Border.Top.Color; }
NLMISC::CRGBA getRightColor() const { return m_Border.Right.Color; }
NLMISC::CRGBA getBottomColor() const { return m_Border.Bottom.Color; }
NLMISC::CRGBA getLeftColor() const { return m_Border.Left.Color; }
void setWidth(uint width)
{
m_Dirty = true;
m_MustComputeValues = true;
m_Border.Top.Width.setFloatValue(width, "px");
m_Border.Right.Width.setFloatValue(width, "px");
m_Border.Bottom.Width.setFloatValue(width, "px");
m_Border.Left.Width.setFloatValue(width, "px");
}
void setColor(const NLMISC::CRGBA &color)
{
m_Dirty = true;
m_Border.Top.Color = color;
m_Border.Right.Color = color;
m_Border.Bottom.Color = color;
m_Border.Left.Color = color;
}
// sizes for em, rem units
void setFontSize(float rootFontSize, float fontSize)
{
m_Dirty = true;
m_MustComputeValues = true;
m_RootFontSize = rootFontSize;
m_FontSize = fontSize;
}
void setViewport(CInterfaceElement *root)
{
m_Dirty = true;
m_MustComputeValues = true;
m_Viewport = root;
}
void draw(); void draw();
}; // CSSBorderRenderer }; // CSSBorderRenderer

@ -0,0 +1,76 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2021 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CL_CSS_LENGTH_H
#define CL_CSS_LENGTH_H
#include "nel/misc/types_nl.h"
#include "nel/gui/css_types.h"
namespace NLGUI
{
/**
* \brief CSS types used in GUI classes
* \date 2021-07-02 11:36 GMT
* \author Meelis Mägi (Nimetu)
*/
class CSSLength
{
public:
enum Kind {
Auto, Relative, Fixed
};
CSSLength(float value = 0, CSSUnitType unit = CSS_UNIT_NONE, Kind kind = Auto)
: m_Value(value), m_Unit(unit), m_Kind(Auto)
{}
void setAuto() { m_Kind = Auto; }
bool parseValue(const std::string &value, bool allowPercent = true, bool allowNegative = false);
void setFloatValue(float f, const std::string &unit);
float getValue() const;
float getFloat() const { return m_Value; }
bool isPercent() const { return m_Unit == CSS_UNIT_PERCENT; }
bool isAuto() const { return m_Kind == Auto; }
bool isRelative() const { return m_Kind == Relative; }
// % uses relValue
// em uses emSize
// rem uses remSize
// vw,vh,vi,vb,vmin,vmax uses vwSize/vhSize
float calculate(uint32 relValue, uint32 emSize, uint32 remSize, uint32 vwSize, uint32 whSize) const;
CSSUnitType getUnit() const { return m_Unit; }
std::string toString() const;
private:
void setUnit(const std::string &unit);
float m_Value;
CSSUnitType m_Unit;
Kind m_Kind;
};
}//namespace
#endif // CL_CSS_LENGTH_H

@ -21,6 +21,9 @@
#include "nel/misc/rgba.h" #include "nel/misc/rgba.h"
#include "nel/gui/css_selector.h" #include "nel/gui/css_selector.h"
#include "nel/gui/css_types.h" #include "nel/gui/css_types.h"
#include "nel/gui/css_length.h"
#include "nel/gui/css_background.h"
#include "nel/gui/css_border.h"
namespace NLGUI namespace NLGUI
{ {
@ -60,18 +63,15 @@ namespace NLGUI
Underlined=false; Underlined=false;
StrikeThrough=false; StrikeThrough=false;
GlobalColor=false; GlobalColor=false;
GlobalColorText=false;
DisplayBlock=false; DisplayBlock=false;
Width=-1; Width=-1;
Height=-1; Height=-1;
MaxWidth=-1; MaxWidth=-1;
MaxHeight=-1; MaxHeight=-1;
// border style
BorderTopWidth = BorderRightWidth = BorderBottomWidth = BorderLeftWidth = CSS_LINE_WIDTH_MEDIUM;
BorderTopStyle = BorderRightStyle = BorderBottomStyle = BorderLeftStyle = CSS_LINE_STYLE_NONE;
BorderTopColor = BorderRightColor = BorderBottomColor = BorderLeftColor = NLMISC::CRGBA::Transparent;
// background // background
BackgroundColor=NLMISC::CRGBA::Black;
BackgroundColorOver=NLMISC::CRGBA::Black; BackgroundColorOver=NLMISC::CRGBA::Black;
MarginTop = MarginRight = MarginBottom = MarginLeft = 0;
PaddingTop = PaddingRight = PaddingBottom = PaddingLeft = 0; PaddingTop = PaddingRight = PaddingBottom = PaddingLeft = 0;
} }
@ -94,6 +94,7 @@ namespace NLGUI
NLMISC::CRGBA TextColor; NLMISC::CRGBA TextColor;
STextShadow TextShadow; STextShadow TextShadow;
bool GlobalColor; bool GlobalColor;
bool GlobalColorText;
bool Underlined; bool Underlined;
bool StrikeThrough; bool StrikeThrough;
bool DisplayBlock; bool DisplayBlock;
@ -101,11 +102,10 @@ namespace NLGUI
sint32 Height; sint32 Height;
sint32 MaxWidth; sint32 MaxWidth;
sint32 MaxHeight; sint32 MaxHeight;
uint32 BorderTopWidth, BorderRightWidth, BorderBottomWidth, BorderLeftWidth; CSSRect<CSSBorder> Border;
CSSLineStyle BorderTopStyle, BorderRightStyle, BorderBottomStyle, BorderLeftStyle; CSSBackground Background;
NLMISC::CRGBA BorderTopColor, BorderRightColor, BorderBottomColor, BorderLeftColor;
NLMISC::CRGBA BackgroundColor;
NLMISC::CRGBA BackgroundColorOver; NLMISC::CRGBA BackgroundColorOver;
uint32 MarginTop, MarginRight, MarginBottom, MarginLeft;
uint32 PaddingTop, PaddingRight, PaddingBottom, PaddingLeft; uint32 PaddingTop, PaddingRight, PaddingBottom, PaddingLeft;
std::string WhiteSpace; std::string WhiteSpace;
@ -177,16 +177,18 @@ namespace NLGUI
// parse 'padding' into 'padding-top', 'padding-left', etc // parse 'padding' into 'padding-top', 'padding-left', etc
void expandPaddingShorthand(const std::string &value, TStyle &style) const; void expandPaddingShorthand(const std::string &value, TStyle &style) const;
void expandMarginShorthand(const std::string &value, TStyle &style) const;
// expand shorthand rule, ie "border", into longhand names, ie "border-top-width" // expand shorthand rule, ie "border", into longhand names, ie "border-top-width"
// if shorthand is present in style, then its removed // if shorthand is present in style, then its removed
void expandShorthand(const std::string &prop, const std::string &value, TStyle &style) const; void expandShorthand(const std::string &prop, const std::string &value, TStyle &style) const;
// parse string value into corresponding value // parse string value into corresponding value
void applyBorderWidth(const std::string &value, uint32 *dest, const uint32 currentWidth, const uint32 fontSize) const; void applyBorderWidth(const std::string &value, CSSLength *dest, const CSSLength &currentWidth) const;
void applyBorderColor(const std::string &value, NLMISC::CRGBA *dest, const NLMISC::CRGBA &currentColor, const NLMISC::CRGBA &textColor) const; void applyBorderColor(const std::string &value, NLMISC::CRGBA *dest, const NLMISC::CRGBA &currentColor, const NLMISC::CRGBA &textColor) const;
void applyLineStyle(const std::string &value, CSSLineStyle *dest, const CSSLineStyle &currentStyle) const; void applyLineStyle(const std::string &value, CSSLineStyle *dest, const CSSLineStyle &currentStyle) const;
void applyPaddingWidth(const std::string &value, uint32 *dest, const uint32 currentPadding, uint32 fontSize) const; void applyPaddingWidth(const std::string &value, uint32 *dest, const uint32 currentPadding, uint32 fontSize) const;
void applyMarginWidth(const std::string &value, uint32 *dest, const uint32 current, uint32 fontSize) const;
// parse and replace var(--name, fallback) function // parse and replace var(--name, fallback) function
// return false if property should be ignored // return false if property should be ignored
@ -215,15 +217,22 @@ namespace NLGUI
_StyleStack.push_back(Current); _StyleStack.push_back(Current);
Current.GlobalColor = false; Current.GlobalColor = false;
// inherit GlobalColorText
Current.DisplayBlock = false; Current.DisplayBlock = false;
Current.Width=-1; Current.Width=-1;
Current.Height=-1; Current.Height=-1;
Current.MaxWidth=-1; Current.MaxWidth=-1;
Current.MaxHeight=-1; Current.MaxHeight=-1;
Current.BorderTopWidth = Current.BorderRightWidth = Current.BorderBottomWidth = Current.BorderLeftWidth = CSS_LINE_WIDTH_MEDIUM; Current.Border.Top.reset();
Current.BorderTopStyle = Current.BorderRightStyle = Current.BorderBottomStyle = Current.BorderLeftStyle = CSS_LINE_STYLE_NONE; Current.Border.Right.reset();
Current.BorderTopColor = Current.BorderRightColor = Current.BorderBottomColor = Current.BorderLeftColor = Current.TextColor; Current.Border.Bottom.reset();
Current.Border.Left.reset();
Current.Background = CSSBackground();
Current.BackgroundColorOver = NLMISC::CRGBA::Transparent;
Current.MarginTop = Current.MarginRight = Current.MarginBottom = Current.MarginLeft = 0;
Current.PaddingTop = Current.PaddingRight = Current.PaddingBottom = Current.PaddingLeft = 0; Current.PaddingTop = Current.PaddingRight = Current.PaddingBottom = Current.PaddingLeft = 0;
Current.StyleRules.clear(); Current.StyleRules.clear();

@ -30,7 +30,12 @@ namespace NLGUI
enum CSSLineStyle { enum CSSLineStyle {
CSS_LINE_STYLE_NONE = 0, CSS_LINE_STYLE_NONE = 0,
CSS_LINE_STYLE_HIDDEN, CSS_LINE_STYLE_HIDDEN,
CSS_LINE_STYLE_DOTTED,
CSS_LINE_STYLE_DASHED,
CSS_LINE_STYLE_SOLID, CSS_LINE_STYLE_SOLID,
CSS_LINE_STYLE_DOUBLE,
CSS_LINE_STYLE_GROOVE,
CSS_LINE_STYLE_RIDGE,
CSS_LINE_STYLE_INSET, CSS_LINE_STYLE_INSET,
CSS_LINE_STYLE_OUTSET CSS_LINE_STYLE_OUTSET
}; };
@ -42,6 +47,53 @@ namespace NLGUI
CSS_LINE_WIDTH_THICK = 5 CSS_LINE_WIDTH_THICK = 5
}; };
enum CSSUnitType {
CSS_UNIT_NONE = 0,
CSS_UNIT_EM,
CSS_UNIT_REM,
CSS_UNIT_PERCENT,
CSS_UNIT_PX,
CSS_UNIT_PT,
CSS_UNIT_VW,
CSS_UNIT_VH,
CSS_UNIT_VI,
CSS_UNIT_VB,
CSS_UNIT_VMIN,
CSS_UNIT_VMAX
};
enum CSSValueType {
CSS_VALUE_NONE = 0,
CSS_VALUE_REPEAT,
CSS_VALUE_SPACE,
CSS_VALUE_ROUND,
CSS_VALUE_NOREPEAT,
CSS_VALUE_FIXED,
CSS_VALUE_LOCAL,
CSS_VALUE_SCROLL,
CSS_VALUE_LEFT,
CSS_VALUE_CENTER,
CSS_VALUE_RIGHT,
CSS_VALUE_TOP,
CSS_VALUE_BOTTOM,
CSS_VALUE_BORDER_BOX,
CSS_VALUE_PADDING_BOX,
CSS_VALUE_CONTENT_BOX,
CSS_VALUE_LENGTH,
CSS_VALUE_AUTO,
CSS_VALUE_COVER,
CSS_VALUE_CONTAIN
};
template<typename T>
struct CSSRect
{
T Top;
T Right;
T Bottom;
T Left;
};
}//namespace }//namespace
#endif // CL_CSS_TYPES_H #endif // CL_CSS_TYPES_H

@ -134,6 +134,16 @@ namespace NLGUI
void setTexturePushed(const std::string &l, const std::string &m, const std::string &r); void setTexturePushed(const std::string &l, const std::string &m, const std::string &r);
void setTextureOver(const std::string &l, const std::string &m, const std::string &r); void setTextureOver(const std::string &l, const std::string &m, const std::string &r);
// lua
void setTextureLua (const std::string &name);
void setTexturePushedLua (const std::string &name);
void setTextureOverLua (const std::string &name);
// return texture _l.tga
std::string getTexture () const;
std::string getTexturePushed () const;
std::string getTextureOver() const;
int luaGetViewText(CLuaState &ls); int luaGetViewText(CLuaState &ls);
REFLECT_EXPORT_START(CCtrlTextButton, CCtrlBaseButton) REFLECT_EXPORT_START(CCtrlTextButton, CCtrlBaseButton)
@ -148,6 +158,9 @@ namespace NLGUI
REFLECT_SINT32("wmin", getWMin, setWMin) REFLECT_SINT32("wmin", getWMin, setWMin)
REFLECT_SINT32("hmin", getHMin, setHMin) REFLECT_SINT32("hmin", getHMin, setHMin)
REFLECT_LUA_METHOD("getViewText", luaGetViewText) REFLECT_LUA_METHOD("getViewText", luaGetViewText)
REFLECT_STRING("texture", getTexture, setTextureLua);
REFLECT_STRING("texture_pushed", getTexturePushed, setTexturePushedLua);
REFLECT_STRING("texture_over", getTextureOver, setTextureOverLua);
REFLECT_EXPORT_END REFLECT_EXPORT_END
void onRemoved(); void onRemoved();

@ -30,6 +30,7 @@
#include "nel/gui/html_element.h" #include "nel/gui/html_element.h"
#include "nel/gui/html_parser.h" #include "nel/gui/html_parser.h"
#include "nel/gui/css_style.h" #include "nel/gui/css_style.h"
#include "nel/gui/css_background_renderer.h"
// forward declaration // forward declaration
typedef void CURLM; typedef void CURLM;
@ -47,6 +48,20 @@ namespace NLGUI
extern std::string CurrentCookie; extern std::string CurrentCookie;
class ICurlDownloadCB
{
public:
ICurlDownloadCB(const std::string &url)
: url(url)
{}
virtual ~ICurlDownloadCB() {};
virtual void finish() = 0;
std::string url;
};
// HTML group // HTML group
/** /**
* Widget to have a resizable scrolltext and its scrollbar * Widget to have a resizable scrolltext and its scrollbar
@ -70,10 +85,7 @@ namespace NLGUI
/// Language code of the browser( e.g.: en, hu ) /// Language code of the browser( e.g.: en, hu )
std::string languageCode; std::string languageCode;
/// List of domains the widget can consider secure. /// List of domains the widget can consider secure.
std::vector<std::string> trustedDomains; std::vector< std::string > trustedDomains;
/// Web server
std::string webServer;
std::string webServerDomain;
/// Maximum concurrent MultiCurl connections per CGroupHTML instance /// Maximum concurrent MultiCurl connections per CGroupHTML instance
sint32 curlMaxConnections; sint32 curlMaxConnections;
@ -136,9 +148,9 @@ namespace NLGUI
void endParagraph(); void endParagraph();
// add image download (used by view_bitmap.cpp to load web images) // add image download (used by view_bitmap.cpp to load web images)
void addImageDownload(const std::string &url, CViewBase *img, const CStyleParams &style = CStyleParams(), const TImageType type = NormalImage, const std::string &placeholder = "web_del.tga"); ICurlDownloadCB *addImageDownload(const std::string &url, CViewBase *img, const CStyleParams &style = CStyleParams(), const TImageType type = NormalImage, const std::string &placeholder = "web_del.tga");
// remove image from download list if present ICurlDownloadCB *addTextureDownload(const std::string &url, sint32 &texId, CViewBase *view);
void removeImageDownload(CViewBase *img); void removeImageDownload(ICurlDownloadCB *handle, CViewBase *img);
std::string localImageName(const std::string &url); std::string localImageName(const std::string &url);
// Timeout // Timeout
@ -168,6 +180,7 @@ namespace NLGUI
std::string DefaultRadioButtonBitmapNormal; std::string DefaultRadioButtonBitmapNormal;
std::string DefaultRadioButtonBitmapPushed; std::string DefaultRadioButtonBitmapPushed;
std::string DefaultRadioButtonBitmapOver; std::string DefaultRadioButtonBitmapOver;
// TODO: remove from interface xml and code
std::string DefaultBackgroundBitmapView; std::string DefaultBackgroundBitmapView;
struct TFormField { struct TFormField {
@ -332,6 +345,9 @@ namespace NLGUI
const std::string &overBitmap, const char *actionHandler, const char *actionHandlerParams, const std::string &tooltip, const std::string &overBitmap, const char *actionHandler, const char *actionHandlerParams, const std::string &tooltip,
const CStyleParams &style = CStyleParams()); const CStyleParams &style = CStyleParams());
// Set the background color
void setupBackground(CSSBackgroundRenderer *bg);
// Set the background color // Set the background color
void setBackgroundColor (const NLMISC::CRGBA &bgcolor); void setBackgroundColor (const NLMISC::CRGBA &bgcolor);
@ -371,6 +387,13 @@ namespace NLGUI
// <style> and downloaded <link rel=stylesheet> elements // <style> and downloaded <link rel=stylesheet> elements
std::vector<std::string> _HtmlStyles; std::vector<std::string> _HtmlStyles;
// background from <html> or <body> element
CSSBackgroundRenderer m_HtmlBackground;
CSSBackgroundRenderer m_BodyBackground;
// active table.tr background color from css or from bgcolor attribute
std::vector<NLMISC::CRGBA> m_TableRowBackgroundColor;
// Valid base href was found // Valid base href was found
bool _IgnoreBaseUrlTag; bool _IgnoreBaseUrlTag;
// Fragment from loading url // Fragment from loading url
@ -820,48 +843,108 @@ namespace NLGUI
// decode all HTML entities // decode all HTML entities
static std::string decodeHTMLEntities(const std::string &str); static std::string decodeHTMLEntities(const std::string &str);
struct CDataImageDownload class CDataDownload : public ICurlDownloadCB
{
public:
CDataDownload(const std::string &u, const std::string &d)
: ICurlDownloadCB(u), data(NULL), fp(NULL), dest(d), redirects(0), ConnectionTimeout(60)
{}
virtual ~CDataDownload();
public:
CCurlWWWData *data;
std::string dest;
std::string tmpdest;
uint32 redirects;
FILE *fp;
uint32 ConnectionTimeout;
};
class StylesheetDownloadCB : public CDataDownload
{ {
public: public:
CDataImageDownload(CViewBase *img, CStyleParams style, TImageType type): Image(img), Style(style), Type(type) StylesheetDownloadCB(const std::string &url, const std::string &dest, CGroupHTML *parent)
: CDataDownload(url, dest), Parent(parent)
{}
virtual void finish() NL_OVERRIDE;
private:
CGroupHTML *Parent;
};
class ImageDownloadCB : public CDataDownload
{
public:
struct SImageInfo
{
SImageInfo(CViewBase *img, const CStyleParams &style, TImageType type)
: Image(img), Style(style), Type(type)
{}
CViewBase *Image;
CStyleParams Style;
TImageType Type;
};
ImageDownloadCB(const std::string &url, const std::string &dest, CViewBase *img, const CStyleParams &style, TImageType type, CGroupHTML *parent)
: CDataDownload(url, dest), Parent(parent)
{ {
addImage(img, style, type);
} }
public:
CViewBase * Image; virtual void finish() NL_OVERRIDE;
void addImage(CViewBase *img, const CStyleParams &style, TImageType type);
void removeImage(CViewBase *img);
private:
std::vector<SImageInfo> Images;
CGroupHTML *Parent;
CStyleParams Style; CStyleParams Style;
TImageType Type; TImageType Type;
}; };
struct CDataDownload class TextureDownloadCB : public CDataDownload
{ {
public: public:
CDataDownload(const std::string &u, const std::string &d, TDataType t, CViewBase *i, const std::string &s, const std::string &m, const CStyleParams &style = CStyleParams(), const TImageType imagetype = NormalImage) TextureDownloadCB(const std::string &url, const std::string &dest, sint32 texId, CViewBase *view)
: data(NULL), fp(NULL), url(u), dest(d), type(t), luaScript(s), md5sum(m), redirects(0), ConnectionTimeout(60) : CDataDownload(url, dest)
{ {
if (t == ImgType) imgs.push_back(CDataImageDownload(i, style, imagetype)); addTexture(texId, view);
}
virtual void finish() NL_OVERRIDE;
void addTexture(sint32 texId, CViewBase *view) {
TextureIds.push_back(std::make_pair(texId, view));
} }
~CDataDownload();
private:
std::vector<std::pair<sint32, CViewBase *> > TextureIds;
};
class BnpDownloadCB : public CDataDownload
{
public: public:
CCurlWWWData *data; BnpDownloadCB(const std::string &url, const std::string &dest, const std::string md5sum, const std::string lua, CGroupHTML *parent)
std::string url; : CDataDownload(url, dest), Parent(parent), m_md5sum(md5sum), m_lua(lua)
std::string dest; {}
std::string tmpdest;
std::string luaScript; virtual void finish() NL_OVERRIDE;
std::string md5sum;
TDataType type; private:
uint32 redirects; CGroupHTML *Parent;
FILE *fp; std::string m_md5sum;
std::vector<CDataImageDownload> imgs; std::string m_lua;
uint32 ConnectionTimeout;
}; };
std::list<CDataDownload> Curls; std::list<CDataDownload*> Curls;
CURLM *MultiCurl; CURLM *MultiCurl;
int RunningCurls; int RunningCurls;
bool startCurlDownload(CDataDownload &download); bool startCurlDownload(CDataDownload *download);
void finishCurlDownload(const CDataDownload &download); void finishCurlDownload(CDataDownload *download);
void pumpCurlQueue(); void pumpCurlQueue();
void initImageDownload(); void initImageDownload();
@ -886,12 +969,13 @@ namespace NLGUI
// stop all curl downalods (html and data) // stop all curl downalods (html and data)
void releaseDownloads(); void releaseDownloads();
void releaseDataDownloads();
void checkDownloads(); void checkDownloads();
// _CurlWWW download finished // _CurlWWW download finished
void htmlDownloadFinished(bool success, const std::string &error); void htmlDownloadFinished(bool success, const std::string &error);
// images, stylesheets, etc finished downloading // images, stylesheets, etc finished downloading
void dataDownloadFinished(bool success, const std::string &error, CDataDownload &data); void dataDownloadFinished(bool success, const std::string &error, CDataDownload *data);
// HtmlType download finished // HtmlType download finished
void htmlDownloadFinished(const std::string &content, const std::string &type, long code); void htmlDownloadFinished(const std::string &content, const std::string &type, long code);
@ -908,9 +992,6 @@ namespace NLGUI
// :before, :after rendering // :before, :after rendering
void renderPseudoElement(const std::string &pseudo, const CHtmlElement &elm); void renderPseudoElement(const std::string &pseudo, const CHtmlElement &elm);
// apply background from current style (for html, body)
void applyBackground(const CHtmlElement &elm);
void insertFormImageButton(const std::string &name, void insertFormImageButton(const std::string &name,
const std::string &tooltip, const std::string &tooltip,
const std::string &src, const std::string &src,

@ -31,6 +31,7 @@
namespace NLGUI namespace NLGUI
{ {
class CSSBorderRenderer; class CSSBorderRenderer;
class CSSBackgroundRenderer;
/** /**
* This group is used to simulate HTML cells. * This group is used to simulate HTML cells.
@ -94,22 +95,10 @@ namespace NLGUI
// Memorize max width // Memorize max width
sint32 WidthMax; sint32 WidthMax;
// The cell color
NLMISC::CRGBA BgColor;
CSSBorderRenderer* Border; CSSBorderRenderer* Border;
CSSBackgroundRenderer *Background;
uint32 PaddingTop, PaddingRight, PaddingBottom, PaddingLeft; uint32 PaddingTop, PaddingRight, PaddingBottom, PaddingLeft;
// Texture
CViewRenderer::CTextureId _TextureId;
bool _TextureTiled;
bool _TextureScaled;
// cached absolute coords for background texture
sint32 _TextureXReal;
sint32 _TextureYReal;
sint32 _TextureWReal;
sint32 _TextureHReal;
// Alignment // Alignment
TAlign Align; TAlign Align;
TVAlign VAlign; TVAlign VAlign;
@ -121,6 +110,7 @@ namespace NLGUI
// The cell is nowrap // The cell is nowrap
bool NoWrap; bool NoWrap;
// deprecated background image
void setTexture(const std::string & TxName); void setTexture(const std::string & TxName);
void setTextureTile(bool tiled); void setTextureTile(bool tiled);
void setTextureScale(bool scaled); void setTextureScale(bool scaled);
@ -134,8 +124,6 @@ namespace NLGUI
static bool getDebugUICell(){ return DebugUICell; } static bool getDebugUICell(){ return DebugUICell; }
private: private:
void updateTextureCoords();
void setEnclosedGroupDefaultParams(); void setEnclosedGroupDefaultParams();
static bool DebugUICell; static bool DebugUICell;
}; };
@ -164,18 +152,18 @@ namespace NLGUI
sint32 ForceWidthMin; sint32 ForceWidthMin;
CSSBorderRenderer* Border; CSSBorderRenderer* Border;
CSSBackgroundRenderer *Background;
// Cell has 1px solid border when <table> has 'border' attribute with width > 0 // Cell has 1px solid border when <table> has 'border' attribute with width > 0
bool CellBorder; bool CellBorder;
sint32 CellPadding; sint32 CellPadding;
sint32 CellSpacing; sint32 CellSpacing;
// The table color
NLMISC::CRGBA BgColor;
uint8 CurrentAlpha; uint8 CurrentAlpha;
bool ContinuousUpdate; bool ContinuousUpdate;
// deprecated background image
void setTexture(const std::string & TxName); void setTexture(const std::string & TxName);
void setTextureTile(bool tiled); void setTextureTile(bool tiled);
void setTextureScale(bool scaled); void setTextureScale(bool scaled);
@ -201,18 +189,6 @@ namespace NLGUI
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup); virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
// Texture
CViewRenderer::CTextureId _TextureId;
bool _TextureTiled;
bool _TextureScaled;
// cached absolute coords for background texture
sint32 _TextureXReal;
sint32 _TextureYReal;
sint32 _TextureWReal;
sint32 _TextureHReal;
void updateTextureCoords();
// Content validated // Content validated
bool _ContentValidated; bool _ContentValidated;

@ -76,16 +76,16 @@ namespace NLGUI
void reindexChilds(); void reindexChilds();
// escape text tag or attribute value // escape text tag or attribute value
std::string htmlEscape(std::string val, bool isAttribute = false) const; std::string htmlEscape(const std::string &val) const;
// serialize element attributes as string // serialize element attributes as string
std::string serializeAttributes() const; std::string serializeAttributes(bool escape = true) const;
// serialize child elements as html string // serialize child elements as html string
std::string serializeChilds() const; std::string serializeChilds(bool escape = true) const;
// serialize itself and children as html string // serialize itself and children as html string
std::string serialize() const; std::string serialize(bool escape = true) const;
// debug // debug
std::string toString(bool tree = false, uint depth = 0) const; std::string toString(bool tree = false, uint depth = 0) const;

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2019-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -383,6 +383,7 @@ namespace NLGUI
void dummySet(const std::string &value); void dummySet(const std::string &value);
public: public:
// export some properties // export some properties
REFLECT_EXPORT_START(CInterfaceElement, CReflectable) REFLECT_EXPORT_START(CInterfaceElement, CReflectable)
REFLECT_BOOL ("active", getActive, setActive); REFLECT_BOOL ("active", getActive, setActive);
@ -397,7 +398,6 @@ namespace NLGUI
REFLECT_SINT32 ("h_real", getHReal, dummySet); REFLECT_SINT32 ("h_real", getHReal, dummySet);
REFLECT_STRING ("id", getIdByValue, dummySet); REFLECT_STRING ("id", getIdByValue, dummySet);
REFLECT_STRING ("sizeref", getSizeRefAsString, setSizeRef); REFLECT_STRING ("sizeref", getSizeRefAsString, setSizeRef);
REFLECT_STRING ("posparent", getPosParent, setPosParent);
REFLECT_LUA_METHOD("updateCoords", luaUpdateCoords); REFLECT_LUA_METHOD("updateCoords", luaUpdateCoords);
REFLECT_LUA_METHOD("invalidateCoords", luaInvalidateCoords); REFLECT_LUA_METHOD("invalidateCoords", luaInvalidateCoords);
REFLECT_LUA_METHOD("invalidateContent", luaInvalidateContent); REFLECT_LUA_METHOD("invalidateContent", luaInvalidateContent);
@ -524,8 +524,6 @@ namespace NLGUI
void parseSizeParent( const std::string &id ); void parseSizeParent( const std::string &id );
void setSizeParent( const std::string &id ); void setSizeParent( const std::string &id );
void getSizeParent( std::string &id ) const; void getSizeParent( std::string &id ) const;
std::string getPosParent() const;
void setSerializable( bool b ){ serializable = b; } void setSerializable( bool b ){ serializable = b; }
bool IsSerializable() const{ return serializable; } bool IsSerializable() const{ return serializable; }

@ -184,7 +184,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
// Read a CSS length value, return true if one of supported units '%, rem, em, px, pt' // Read a CSS length value, return true if one of supported units '%, rem, em, px, pt'
// On failure: 'value' and 'unit' values are undefined // On failure: 'value' and 'unit' values are undefined
bool getCssLength (float &value, std::string &unit, const std::string &str); bool getCssLength (float &value, std::string &unit, const std::string &str, bool neg = false);
// Read a width HTML parameter. "100" or "100%". Returns true if percent (0 ~ 1) else false // Read a width HTML parameter. "100" or "100%". Returns true if percent (0 ~ 1) else false
bool getPercentage (sint32 &width, float &percent, const char *str); bool getPercentage (sint32 &width, float &percent, const char *str);

@ -28,6 +28,7 @@
namespace NLGUI namespace NLGUI
{ {
class ICurlDownloadCB;
/** /**
* class implementing a bitmap view * class implementing a bitmap view
@ -61,7 +62,7 @@ namespace NLGUI
_TxtHeight = -1; _TxtHeight = -1;
// Support for https://.. textures // Support for https://.. textures
_HtmlDownload = false; _HtmlDownload = NULL;
} }
/// Destructor /// Destructor
@ -141,7 +142,9 @@ namespace NLGUI
bool _Flip : 1; bool _Flip : 1;
bool _Tile : 1; bool _Tile : 1;
bool _InheritGCAlpha : 1; bool _InheritGCAlpha : 1;
bool _HtmlDownload : 1;
// pointer to active curl download object
ICurlDownloadCB *_HtmlDownload;
// For single texture // For single texture

@ -252,6 +252,19 @@ namespace NLGUI
*/ */
bool loadTextures (const std::string &textureFileName, const std::string &uvFileName, bool uploadDXTC); bool loadTextures (const std::string &textureFileName, const std::string &uvFileName, bool uploadDXTC);
/*
* newTextureId : Return new placeholder texture id.
* You should call deleteTexture when the texture is not used anymore.
*/
sint32 newTextureId (const std::string &name);
/*
* reloadTexture : Replace existing global texture with new.
* If previous was texture atlas and still used by 2+ textures,
* then create new global texture.
*/
void reloadTexture (sint32 texId, const std::string &name, bool uploadDXTC=true, bool bReleasable=true);
/* /*
* createTexture : create a texture for the interface, possibly from an externally created texture * createTexture : create a texture for the interface, possibly from an externally created texture
* If no external texture is given, then 'sGlobalTextureName' is the filename of the big texture * If no external texture is given, then 'sGlobalTextureName' is the filename of the big texture
@ -312,6 +325,9 @@ namespace NLGUI
/** /**
* get a texture file pointer from a string name. O(logN) * get a texture file pointer from a string name. O(logN)
*
* FIXME: only works with textures in atlas loaded with loadTextures()
*
* \param id : the id of the texture * \param id : the id of the texture
* \return a texture file pointer. -1 if not found or if sName is empty() * \return a texture file pointer. -1 if not found or if sName is empty()
*/ */
@ -479,6 +495,9 @@ namespace NLGUI
// \name Texture management // \name Texture management
// *************************************************************************** // ***************************************************************************
bool loadTextureFromString(SGlobalTexture *gt, const std::string &data);
bool loadTextureFromFile(SGlobalTexture *gt, const std::string &filename);
// SImage accessors // SImage accessors
SImage *getSImage(sint32 textureId) SImage *getSImage(sint32 textureId)
{ {

@ -119,8 +119,8 @@ namespace NLGUI
void enableStringSelection(uint start, uint end); void enableStringSelection(uint start, uint end);
void disableStringSelection(); void disableStringSelection();
/// Get /// Get displayed text
std::string getText() const { return _HardText.empty() ? _Text : _HardText; } std::string getText() const { return _Text; }
#ifdef RYZOM_LUA_UCSTRING #ifdef RYZOM_LUA_UCSTRING
ucstring getTextAsUtf16() const; // Compatibility ucstring getTextAsUtf16() const; // Compatibility
ucstring getHardTextAsUtf16() const; // Compatibility ucstring getHardTextAsUtf16() const; // Compatibility
@ -188,6 +188,7 @@ namespace NLGUI
/// From a line number, get the character at which it ends (not including any '\n' ), or -1 if invalid /// From a line number, get the character at which it ends (not including any '\n' ), or -1 if invalid
void getLineEndIndex(uint line, sint &index, bool &endOfPreviousLine) const; void getLineEndIndex(uint line, sint &index, bool &endOfPreviousLine) const;
/// If localized, return localization key (ie "uiLanguage"), else return displayed text.
std::string getHardText() const { return _HardText.empty() ? _Text : _HardText; } std::string getHardText() const { return _HardText.empty() ? _Text : _HardText; }
void setHardText (const std::string &ht); //< Localizes strings starting with "ui" void setHardText (const std::string &ht); //< Localizes strings starting with "ui"
#ifdef RYZOM_LUA_UCSTRING #ifdef RYZOM_LUA_UCSTRING
@ -282,8 +283,10 @@ namespace NLGUI
bool _FontSizeCoef; bool _FontSizeCoef;
bool _Embolden; bool _Embolden;
bool _Oblique; bool _Oblique;
// width of the font in pixel. Just a Hint for tabing format (computed with '_') // width of the font in pixel.
float _FontWidth; float _FontWidth;
// width of tabs
float _TabWidth;
// strings to use when computing font size // strings to use when computing font size
std::string _FontSizingChars; std::string _FontSizingChars;
std::string _FontSizingFallback; std::string _FontSizingFallback;

@ -654,8 +654,6 @@ namespace NLGUI
bool _GroupSelection; bool _GroupSelection;
bool multiSelection; bool multiSelection;
uint32 _WidgetCount; uint32 _WidgetCount;
std::set<std::string> m_LoggedMissingElement;
}; };
} }

@ -3,7 +3,6 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -68,7 +67,7 @@ public:
S17, S18, S19, S20, S21, S22, S23, S24, S25, S26, S27, S28, S29, S30, S31, S32, S17, S18, S19, S20, S21, S22, S23, S24, S25, S26, S27, S28, S29, S30, S31, S32,
S33, S34, S35, S36, S37, S38, S39, S40, S41, S42, S43, S44, S45, S46, S47, S48, S33, S34, S35, S36, S37, S38, S39, S40, S41, S42, S43, S44, S45, S46, S47, S48,
S49, S50, S51, S52, S53, S54, S55, S56, S57, S58, S59, S60, S61, S62, S63, S64, S49, S50, S51, S52, S53, S54, S55, S56, S57, S58, S59, S60, S61, S62, S63, S64,
TEXT, PACKED, Nb_Prop_Type TEXT, Nb_Prop_Type
}; };

@ -3,7 +3,6 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -97,7 +96,7 @@ public:
_Property = 0; _Property = 0;
_oldProperty = 0; _oldProperty = 0;
_Type = UNKNOWN; _Type = UNKNOWN;
_Nullable = false; m_Nullable = false;
_Changed = false; _Changed = false;
_LastChangeGC = 0; _LastChangeGC = 0;
} }
@ -238,7 +237,7 @@ private:
EPropType _Type; EPropType _Type;
/// nullable /// nullable
bool _Nullable; bool m_Nullable;
/// true if this value has changed /// true if this value has changed
bool _Changed; bool _Changed;

@ -380,7 +380,7 @@ extern bool _assertex_stop_1(bool &ignoreNextTime);
#define nlassume(exp) do { } while (0) #define nlassume(exp) do { } while (0)
#endif #endif
#ifdef NL_NO_DEBUG #ifdef NL_NO_ASSERT
# define nlassert(exp) nlassume(exp) # define nlassert(exp) nlassume(exp)
# define nlassertonce(exp) nlassume(exp) # define nlassertonce(exp) nlassume(exp)
# define nlassertex(exp, str) nlassume(exp) # define nlassertex(exp, str) nlassume(exp)

@ -25,7 +25,6 @@
#include "debug.h" #include "debug.h"
#include "common.h" #include "common.h"
#include "stream.h" #include "stream.h"
#include "wang_hash.h"
namespace NLMISC { namespace NLMISC {
@ -578,7 +577,6 @@ public:
};*/ };*/
// Traits for hash_map using CEntityId // Traits for hash_map using CEntityId
#if 0
struct CEntityIdHashMapTraits struct CEntityIdHashMapTraits
{ {
enum { bucket_size = 4, min_buckets = 8 }; enum { bucket_size = 4, min_buckets = 8 };
@ -598,27 +596,7 @@ struct CEntityIdHashMapTraits
return id1.getShortId() < id2.getShortId(); return id1.getShortId() < id2.getShortId();
} }
}; };
#else
struct CEntityIdHashMapTraits
{
enum { bucket_size = 4, min_buckets = 8 };
CEntityIdHashMapTraits() { }
size_t operator() (const NLMISC::CEntityId &id ) const
{
uint64 hash64 = id.getUniqueId();
if (sizeof(size_t) == 8)
{
return (size_t)NLMISC::wangHash64(hash64);
}
else
{
uint32 hash32a = NLMISC::wangHash((uint32)(hash64 & 0xFFFFFFFF));
uint32 hash32b = NLMISC::wangHash((uint32)(hash64 >> 32));
return hash32a ^ hash32b;
}
}
};
#endif
/*inline std::stringstream &operator << (std::stringstream &__os, const CEntityId &__t) /*inline std::stringstream &operator << (std::stringstream &__os, const CEntityId &__t)
{ {

@ -71,8 +71,11 @@ public:
*/ */
void registerClass(const KeyType &key, IFactoryRegister<BaseClass> *factoryRegister) void registerClass(const KeyType &key, IFactoryRegister<BaseClass> *factoryRegister)
{ {
nlassert(_FactoryRegisters.find(key) == _FactoryRegisters.end()); // TODO: Removed assert because of crash of fes in 2019. We need found why... (ulukyn)
_FactoryRegisters.insert(std::make_pair(key, factoryRegister)); //nlassert(_FactoryRegisters.find(key) == _FactoryRegisters.end());
//_FactoryRegisters.insert(std::make_pair(key, factoryRegister));
if (_FactoryRegisters.find(key) == _FactoryRegisters.end())
_FactoryRegisters.insert(std::make_pair(key, factoryRegister));
} }
/** Create a new instance of a factorable object. /** Create a new instance of a factorable object.

@ -174,10 +174,6 @@
# define NL_COMP_GCC # define NL_COMP_GCC
#endif #endif
#if defined(_HAS_CPP0X) || defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(NL_COMP_VC_VERSION) && NL_COMP_VC_VERSION >= 110)
# define NL_ISO_CPP0X_AVAILABLE
#endif
#if defined(NL_COMP_GCC) && (__cplusplus >= 201103L) #if defined(NL_COMP_GCC) && (__cplusplus >= 201103L)
# define NL_NO_EXCEPTION_SPECS # define NL_NO_EXCEPTION_SPECS
#endif #endif
@ -233,6 +229,10 @@
# endif # endif
#endif #endif
#if defined(_HAS_CPP0X) || defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(NL_COMP_VC_VERSION) && NL_COMP_VC_VERSION >= 110) || (defined(NL_COMP_GCC) && (GCC_VERSION >= 40400) && (__cplusplus >= 201103L))
# define NL_ISO_CPP0X_AVAILABLE
#endif
// Remove stupid Visual C++ warnings // Remove stupid Visual C++ warnings
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
# pragma warning (disable : 4503) // STL: Decorated name length exceeded, name was truncated # pragma warning (disable : 4503) // STL: Decorated name length exceeded, name was truncated
@ -274,7 +274,7 @@
//#define NL_NO_DEBUG //#define NL_NO_DEBUG
#undef NL_NO_DEBUG #undef NL_NO_DEBUG
#define NL_NO_ASSERT
// Standard types // Standard types

@ -20,6 +20,8 @@
#ifndef NL_UCSTRING_H #ifndef NL_UCSTRING_H
#define NL_UCSTRING_H #define NL_UCSTRING_H
#define RYZOM_LUA_UCSTRING
#include "types_nl.h" #include "types_nl.h"
#include "debug.h" #include "debug.h"

@ -72,3 +72,4 @@
#endif // XML_MACROS_H #endif // XML_MACROS_H

@ -1,9 +1,6 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -95,11 +92,6 @@ public:
/// exchange memory data /// exchange memory data
void swap(CMessage &other); void swap(CMessage &other);
#ifdef NL_CPP14
/// Move operator
CMessage &operator=(CMessage &&other) noexcept { swap(other); return *this; }
#endif
/// Sets the message type as a string and put it in the buffer if we are in writing mode /// Sets the message type as a string and put it in the buffer if we are in writing mode
void setType (const std::string &name, TMessageType type=OneWay); void setType (const std::string &name, TMessageType type=OneWay);

@ -42,7 +42,7 @@
// Current version is 2, Ryzom Live uses 1 // Current version is 2, Ryzom Live uses 1
// Provided to allow compatibility with old binary files // Provided to allow compatibility with old binary files
#define NLSOUND_SHEET_VERSION_BUILT 2 #define NLSOUND_SHEET_VERSION_BUILT 1
namespace NLLIGO { namespace NLLIGO {
class CLigoConfig; class CLigoConfig;

@ -34,7 +34,7 @@ class CCurlHttpClient
public: public:
/// Constructor /// Constructor
CCurlHttpClient() : _CurlStruct(NULL) {} CCurlHttpClient() : _CurlStruct(NULL), m_Verify(true) {}
/// Connect to an http server (string by val is intended). If you specify a whole URL, an attempt will be made to determine the server. /// Connect to an http server (string by val is intended). If you specify a whole URL, an attempt will be made to determine the server.
bool connect(const std::string &server); bool connect(const std::string &server);
@ -63,6 +63,8 @@ public:
/// Disconnect if connected (otherwise does nothing) /// Disconnect if connected (otherwise does nothing)
void disconnect(); void disconnect();
const char *lastError() { return &m_ErrorBuf[0]; }
protected: protected:
/// Helper /// Helper
@ -78,6 +80,10 @@ private:
std::vector<uint8> _ReceiveBuffer; std::vector<uint8> _ReceiveBuffer;
std::string _Auth; // must be kept here because curl only stores the char pointer std::string _Auth; // must be kept here because curl only stores the char pointer
std::vector<char> m_ErrorBuf;
bool m_Verify;
}; };
extern CCurlHttpClient CurlHttpClient; extern CCurlHttpClient CurlHttpClient;

@ -4,6 +4,7 @@ ADD_EXECUTABLE(nl_sample_font WIN32 ${SRC})
ADD_DEFINITIONS(-DFONT_DIR="\\"${NL_SHARE_ABSOLUTE_PREFIX}/nl_sample_font/\\"") ADD_DEFINITIONS(-DFONT_DIR="\\"${NL_SHARE_ABSOLUTE_PREFIX}/nl_sample_font/\\"")
# TODO: hunter TARGET_LINK_LIBRARIES(nl_sample_font PRIVATE nelmisc nel3d)
TARGET_LINK_LIBRARIES(nl_sample_font nelmisc nel3d) TARGET_LINK_LIBRARIES(nl_sample_font nelmisc nel3d)
NL_DEFAULT_PROPS(nl_sample_font "NeL, Samples, 3D: Font") NL_DEFAULT_PROPS(nl_sample_font "NeL, Samples, 3D: Font")
NL_ADD_RUNTIME_FLAGS(nl_sample_font) NL_ADD_RUNTIME_FLAGS(nl_sample_font)

@ -283,18 +283,16 @@ void CDriverD3D::setupScissor (const class CScissor& scissor)
// Get viewport // Get viewport
_ScissorTouched = false; _ScissorTouched = false;
float x= scissor.X; float x= scissor.X;
float y= scissor.Y;
float width= scissor.Width; float width= scissor.Width;
float height= scissor.Height; float height= scissor.Height;
if(x==0 && x==0 && width==1 && height==1) if(x==0 && y==0 && width==1 && height==1)
{ {
setRenderState (D3DRS_SCISSORTESTENABLE, FALSE); setRenderState (D3DRS_SCISSORTESTENABLE, FALSE);
} }
else else
{ {
float y= scissor.Y;
if (_HWnd) if (_HWnd)
{ {
// Get the render target size // Get the render target size

@ -999,6 +999,9 @@ private:
bool createWindow(const GfxMode& mode); bool createWindow(const GfxMode& mode);
bool destroyWindow(); bool destroyWindow();
// Return monitor info and positon in multi monitor setup or false if monitor not found.
bool getMonitorByName(const std::string &name, sint32 &x, sint32 &y, uint32 &w, uint32 &h) const;
enum EWindowStyle { EWSWindowed, EWSFullscreen }; enum EWindowStyle { EWSWindowed, EWSFullscreen };
void setWindowSize(uint32 width, uint32 height); void setWindowSize(uint32 width, uint32 height);

@ -1,5 +1,5 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010-2017 Winch Gate Property Limited // Copyright (C) 2010-2020 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
@ -1275,7 +1275,7 @@ static bool setupNVFragmentProgram2(const char *glext)
{ {
H_AUTO_OGL(setupNVFragmentProgram2); H_AUTO_OGL(setupNVFragmentProgram2);
CHECK_EXT("GL_NV_fragment_program2"); CHECK_EXT("GL_NV_fragment_program2");
return true; return true;
} }
@ -1284,7 +1284,7 @@ static bool setupARBFragmentShader(const char *glext)
{ {
H_AUTO_OGL(setupNVFragmentProgram2); H_AUTO_OGL(setupNVFragmentProgram2);
CHECK_EXT("GL_ARB_fragment_shader"); CHECK_EXT("GL_ARB_fragment_shader");
return true; return true;
} }
@ -1699,12 +1699,12 @@ void registerGlExtensions(CGlExtensions &ext)
ext.EXTVertexShader = false; ext.EXTVertexShader = false;
ext.ARBVertexProgram = false; ext.ARBVertexProgram = false;
} }
// Check pixel program // Check pixel program
// Disable feature ??? // Disable feature ???
if (!ext.DisableHardwarePixelProgram) if (!ext.DisableHardwarePixelProgram)
{ {
ext.ARBFragmentProgram = setupARBFragmentProgram(glext); ext.ARBFragmentProgram = setupARBFragmentProgram(glext);
ext.NVFragmentProgram2 = setupNVFragmentProgram2(glext); ext.NVFragmentProgram2 = setupNVFragmentProgram2(glext);
ext.ARBFragmentShader = setupARBFragmentShader(glext); ext.ARBFragmentShader = setupARBFragmentShader(glext);
} }

@ -650,8 +650,6 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re
_win = EmptyWindow; _win = EmptyWindow;
_CurrentMode = mode;
_WindowVisible = false; _WindowVisible = false;
_Resizable = resizeable; _Resizable = resizeable;
_DestroyWindow = false; _DestroyWindow = false;
@ -1194,6 +1192,8 @@ bool CDriverGL::saveScreenMode()
#ifdef HAVE_XRANDR #ifdef HAVE_XRANDR
// TODO: if using mode switching, save current xrandr mode to _OldSizeID
res = true;
if (!res && _xrandr_version > 0) if (!res && _xrandr_version > 0)
{ {
XRRScreenConfiguration *screen_config = XRRGetScreenInfo(_dpy, RootWindow(_dpy, screen)); XRRScreenConfiguration *screen_config = XRRGetScreenInfo(_dpy, RootWindow(_dpy, screen));
@ -1254,6 +1254,8 @@ bool CDriverGL::restoreScreenMode()
#ifdef HAVE_XRANDR #ifdef HAVE_XRANDR
// TODO: if using mode switching, then restore mode from _OldSizeID
res = true;
if (!res && _xrandr_version > 0) if (!res && _xrandr_version > 0)
{ {
Window root = RootWindow(_dpy, screen); Window root = RootWindow(_dpy, screen);
@ -1348,7 +1350,8 @@ bool CDriverGL::setScreenMode(const GfxMode &mode)
&& mode.Width == previousMode.Width && mode.Width == previousMode.Width
&& mode.Height == previousMode.Height && mode.Height == previousMode.Height
&& mode.Depth == previousMode.Depth && mode.Depth == previousMode.Depth
&& mode.Frequency == previousMode.Frequency) && mode.Frequency == previousMode.Frequency
&& mode.DisplayDevice == previousMode.DisplayDevice)
return true; return true;
#if defined(NL_OS_WINDOWS) #if defined(NL_OS_WINDOWS)
@ -1388,6 +1391,8 @@ bool CDriverGL::setScreenMode(const GfxMode &mode)
bool found = false; bool found = false;
#ifdef HAVE_XRANDR #ifdef HAVE_XRANDR
// TODO: implement mode switching using xrandr crts
found = true;
if (!found && _xrandr_version > 0) if (!found && _xrandr_version > 0)
{ {
@ -1911,8 +1916,92 @@ bool CDriverGL::setWindowStyle(EWindowStyle windowStyle)
return true; return true;
} }
bool CDriverGL::getMonitorByName(const std::string &name, sint32 &x, sint32 &y, uint32 &w, uint32 &h) const
{
bool found = false;
#if HAVE_XRANDR
int screen = DefaultScreen(_dpy);
// xrandr 1.5+
if (_xrandr_version >= 105)
{
int nmonitors = 0;
XRRMonitorInfo *monitor = XRRGetMonitors(_dpy, RootWindow(_dpy, screen), 1, &nmonitors);
if (!monitor)
return false;
for(sint i = 0; i< nmonitors; ++i)
{
char* pname = XGetAtomName(_dpy, monitor[i].name);
found = (nlstricmp(pname, name) == 0);
XFree(pname);
if (found)
{
x = monitor[i].x;
y = monitor[i].y;
w = monitor[i].width;
h = monitor[i].height;
break;
}
}
XRRFreeMonitors(monitor);
}
else
{
XRRScreenResources *resources = XRRGetScreenResourcesCurrent(_dpy, RootWindow(_dpy, screen));
if (!resources)
resources = XRRGetScreenResources(_dpy, RootWindow(_dpy, screen));
for(uint i = 0; i < resources->noutput; ++i)
{
XRROutputInfo *output = XRRGetOutputInfo(_dpy, resources, resources->outputs[i]);
if (!output)
continue;
if (output->crtc && output->connection == RR_Connected && nlstricmp(name, output->name) == 0)
{
// physical monitor
XRRCrtcInfo *crtc = XRRGetCrtcInfo(_dpy, resources, output->crtc);
if (crtc)
{
found = true;
x = crtc->x;
y = crtc->y;
// TODO: test rotation
if (crtc->rotation == RR_Rotate_0 || crtc->rotation == RR_Rotate_180)
{
w = crtc->width;
h = crtc->height;
}
else
{
w = crtc->height;
h = crtc->width;
}
XRRFreeCrtcInfo(crtc);
}
}
XRRFreeOutputInfo(output);
if (found)
break;
}
XRRFreeScreenResources(resources);
}
#endif
return found;
}
// -------------------------------------------------- // --------------------------------------------------
bool CDriverGL::setMode(const GfxMode& mode) bool CDriverGL::setMode(const GfxMode& amode)
{ {
H_AUTO_OGL(CDriverGL_setMode); H_AUTO_OGL(CDriverGL_setMode);
@ -1920,6 +2009,10 @@ bool CDriverGL::setMode(const GfxMode& mode)
if (!_DestroyWindow) if (!_DestroyWindow)
return true; return true;
#if !(HAVE_XRANDR)
const GfxMode &mode = amode;
#endif
#if defined(NL_OS_WINDOWS) #if defined(NL_OS_WINDOWS)
// save relative cursor // save relative cursor
POINT cursorPos; POINT cursorPos;
@ -1929,21 +2022,92 @@ bool CDriverGL::setMode(const GfxMode& mode)
BOOL cursorPosOk = isSystemCursorInClientArea() BOOL cursorPosOk = isSystemCursorInClientArea()
&& GetCursorPos(&cursorPos) && GetCursorPos(&cursorPos)
&& ScreenToClient(_win, &cursorPos); && ScreenToClient(_win, &cursorPos);
// FIXME: this probably needs to use _CurrentMode instead of mode
sint curX = (sint)cursorPos.x * (sint)mode.Width; sint curX = (sint)cursorPos.x * (sint)mode.Width;
sint curY = (sint)cursorPos.y * (sint)mode.Height; sint curY = (sint)cursorPos.y * (sint)mode.Height;
#endif #endif
#if HAVE_XRANDR
GfxMode mode = amode;
if (!mode.Windowed)
{
GfxMode current;
if (!getCurrentScreenMode(current))
nlinfo("3D: XrandR: Reading active monitor info failed");
sint newX = _WindowX;
sint newY = _WindowY;
// make sure resolution matches requested or currently active monitor's resolution
mode.Width = current.Width;
mode.Height = current.Height;
if (!mode.DisplayDevice.empty())
{
uint newW = current.Width;
uint newH = current.Height;
if (getMonitorByName(mode.DisplayDevice, newX, newY, newW, newH))
{
mode.Width = newW;
mode.Height = newH;
}
else
{
nlinfo("3D: XrandR: Reading requested monitor '%s' info failed, using '%s'", mode.DisplayDevice.c_str(), current.DisplayDevice.c_str());
mode.DisplayDevice = current.DisplayDevice;
}
}
// switching monitors.
// first move mouse pointer to target monitor and then move window.
// if window is visible, then also restore mouse relative position.
if (!mode.DisplayDevice.empty() && mode.DisplayDevice != current.DisplayDevice)
{
setWindowStyle(EWSWindowed);
int screen = DefaultScreen(_dpy);
Window root = RootWindow(_dpy, screen);
uint mouseX = mode.Width / 2;
uint mouseY = mode.Height / 2;
XWindowAttributes xwa;
XGetWindowAttributes(_dpy, _win, &xwa);
if (xwa.map_state != IsUnmapped)
{
Window root_win;
Window child_win;
sint root_x, root_y, win_x, win_y;
uint mask;
Bool res = XQueryPointer(_dpy, _win, &root_win, &child_win, &root_x, &root_y, &win_x, &win_y, &mask);
if (res)
{
mouseX = (uint)((float)win_x * mode.Width / current.Width);
mouseY = (uint)((float)win_y * mode.Height / current.Height);
}
}
XWarpPointer(_dpy, None, root, None, None, None, None, newX + mouseX, newY + mouseY);
XMoveWindow(_dpy, _win, newX, newY);
_WindowX = newX;
_WindowY = newY;
setWindowStyle(EWSFullscreen);
}
}
#endif
if (!setScreenMode(mode)) if (!setScreenMode(mode))
return false; return false;
_CurrentMode.Depth = mode.Depth;
_CurrentMode.Frequency = mode.Frequency;
_CurrentMode.DisplayDevice = mode.DisplayDevice;
// when changing window style, it's possible system change window size too // when changing window style, it's possible system change window size too
setWindowStyle(mode.Windowed ? EWSWindowed : EWSFullscreen); setWindowStyle(mode.Windowed ? EWSWindowed : EWSFullscreen);
if (!mode.Windowed)
_CurrentMode.Depth = mode.Depth;
setWindowSize(mode.Width, mode.Height);
setWindowPos(_WindowX, _WindowY); setWindowPos(_WindowX, _WindowY);
setWindowSize(mode.Width, mode.Height);
switch (_CurrentMode.Depth) switch (_CurrentMode.Depth)
{ {
@ -2120,6 +2284,66 @@ bool CDriverGL::getModes(std::vector<GfxMode> &modes)
int screen = DefaultScreen(_dpy); int screen = DefaultScreen(_dpy);
#if defined(HAVE_XRANDR) #if defined(HAVE_XRANDR)
if (_xrandr_version >= 105)
{
int nmonitors = 0;
// virtual monitors
XRRMonitorInfo *monitor = XRRGetMonitors(_dpy, RootWindow(_dpy, screen), 1, &nmonitors);
for(sint i = 0; i < nmonitors; ++i)
{
char * name = XGetAtomName(_dpy, monitor[i].name);
GfxMode mode;
mode.DisplayDevice = name;
mode.Width = monitor[i].width;
mode.Height = monitor[i].height;
mode.Frequency = 0;
modes.push_back(mode);
XFree(name);
}
XRRFreeMonitors(monitor);
}
else
{
XRRScreenResources *resources = XRRGetScreenResourcesCurrent(_dpy, RootWindow(_dpy, screen));
if (!resources)
resources = XRRGetScreenResources(_dpy, RootWindow(_dpy, screen));
std::map<int, int> resourceModeMap;
for(sint i = 0; i< resources->nmode; ++i)
resourceModeMap.insert(std::make_pair(resources->modes[i].id, i));
for(sint i = 0; i < resources->noutput; ++i)
{
XRROutputInfo *output = XRRGetOutputInfo(_dpy, resources, resources->outputs[i]);
if (!output)
continue;
if (output->crtc && output->connection == RR_Connected)
{
// physical monitor
XRRCrtcInfo *crtc = XRRGetCrtcInfo(_dpy, resources, output->crtc);
if (crtc)
{
std::map<int,int>::const_iterator it = resourceModeMap.find(crtc->mode);
if (it != resourceModeMap.end())
{
GfxMode mode;
mode.DisplayDevice = output->name;
mode.Width = resources->modes[it->second].width;
mode.Height = resources->modes[it->second].height;
mode.Frequency = 0;
modes.push_back(mode);
}
XRRFreeCrtcInfo(crtc);
}
}
XRRFreeOutputInfo(output);
}
XRRFreeScreenResources(resources);
}
found = modes.size() > 0;
if (!found && _xrandr_version >= 100) if (!found && _xrandr_version >= 100)
{ {
XRRScreenConfiguration *screen_config = XRRGetScreenInfo(_dpy, RootWindow(_dpy, screen)); XRRScreenConfiguration *screen_config = XRRGetScreenInfo(_dpy, RootWindow(_dpy, screen));
@ -2255,6 +2479,120 @@ bool CDriverGL::getCurrentScreenMode(GfxMode &mode)
int screen = DefaultScreen(_dpy); int screen = DefaultScreen(_dpy);
#ifdef HAVE_XRANDR #ifdef HAVE_XRANDR
int x = 0;
int y = 0;
Window child;
// get window position so we can compare monitors (or mouse position if window not visible yet)
XWindowAttributes xwa;
XGetWindowAttributes(_dpy, _win, &xwa);
if (xwa.map_state != IsUnmapped)
{
XTranslateCoordinates(_dpy, _win, xwa.root, xwa.x, xwa.y, &x, &y, &child);
}
else
{
sint rx, ry, wx, wy;
uint mask;
Bool res = XQueryPointer(_dpy, RootWindow(_dpy, screen), &child, &child, &rx, &ry, &wx, &wy, &mask);
if (res)
{
x = rx;
y = ry;
}
}
if (_xrandr_version >= 105)
{
int nmonitors = 0;
XRRMonitorInfo *monitor = XRRGetMonitors(_dpy, RootWindow(_dpy, screen), 1, &nmonitors);
if (monitor)
{
sint bestMatch = -1;
for(sint i = 0; i< nmonitors; ++i)
{
if ((x >= monitor[i].x && x < (monitor[i].x + monitor[i].width) &&
y >= monitor[i].y && y < (monitor[i].y + monitor[i].height)) ||
(monitor[i].primary && bestMatch == -1))
{
bestMatch = i;
}
}
// best match or primary monitor
if (bestMatch != -1)
{
found = true;
char* pname = XGetAtomName(_dpy, monitor[bestMatch].name);
mode.DisplayDevice = pname;
mode.Width = monitor[bestMatch].width;
mode.Height = monitor[bestMatch].height;
mode.Windowed = _CurrentMode.Windowed;
mode.OffScreen = false;
mode.Depth = (uint) DefaultDepth(_dpy, screen);
mode.Frequency = 0;
XFree(pname);
}
XRRFreeMonitors(monitor);
}
}
else
{
XRRScreenResources *resources = XRRGetScreenResourcesCurrent(_dpy, RootWindow(_dpy, screen));
if (!resources)
resources = XRRGetScreenResources(_dpy, RootWindow(_dpy, screen));
for(uint i = 0; i < resources->noutput; ++i)
{
XRROutputInfo *output = XRRGetOutputInfo(_dpy, resources, resources->outputs[i]);
if (!output)
continue;
if (output->crtc && output->connection == RR_Connected)
{
XRRCrtcInfo *crtc = XRRGetCrtcInfo(_dpy, resources, output->crtc);
if (crtc)
{
sint width, height;
bool match = false;
// TODO: test rotation
if (crtc->rotation == RR_Rotate_0 || crtc->rotation == RR_Rotate_180)
{
width = crtc->width;
height = crtc->height;
}
else
{
width = crtc->height;
height = crtc->width;
}
if (x >= crtc->x && y >= crtc->y && x < (crtc->x + width) && y < (crtc->y + height))
{
found = true;
mode.DisplayDevice = output->name;
mode.Width = width;
mode.Height = height;
mode.Windowed = _CurrentMode.Windowed;
mode.OffScreen = false;
mode.Depth = (uint) DefaultDepth(_dpy, screen);
mode.Frequency = 0;
}
XRRFreeCrtcInfo(crtc);
}
}
XRRFreeOutputInfo(output);
if (found)
break;
}
XRRFreeScreenResources(resources);
}
if (!found && _xrandr_version > 0) if (!found && _xrandr_version > 0)
{ {
@ -2432,7 +2770,6 @@ void CDriverGL::setWindowPos(sint32 x, sint32 y)
_DecorationWidth = -1; _DecorationWidth = -1;
_DecorationHeight = -1; _DecorationHeight = -1;
} }
XMoveWindow(_dpy, _win, x, y); XMoveWindow(_dpy, _win, x, y);
} }
@ -2771,13 +3108,24 @@ void CDriverGL::setWindowSize(uint32 width, uint32 height)
SetWindowPos(_win, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags); SetWindowPos(_win, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, flags);
// init window width and height // init window width and height
RECT clientRect; if (_CurrentMode.Windowed)
GetClientRect(_win, &clientRect); {
_CurrentMode.Width = uint16(clientRect.right-clientRect.left); // TODO: this gives wrong info for initial fullscreen window so limit for windowed only for now
_CurrentMode.Height = uint16(clientRect.bottom-clientRect.top); RECT clientRect;
GetWindowRect(_win, &clientRect); GetClientRect(_win, &clientRect);
_WindowX = clientRect.left; _CurrentMode.Width = uint16(clientRect.right-clientRect.left);
_WindowY = clientRect.top; _CurrentMode.Height = uint16(clientRect.bottom-clientRect.top);
GetWindowRect(_win, &clientRect);
_WindowX = clientRect.left;
_WindowY = clientRect.top;
}
else
{
_CurrentMode.Width = width;
_CurrentMode.Height = height;
_WindowX = 0;
_WindowY = 0;
}
#elif defined(NL_OS_MAC) #elif defined(NL_OS_MAC)

@ -152,7 +152,7 @@ static NLMISC::TKey virtualKeycodeToNelKey(unsigned short keycode)
return NLMISC::KeyNOKEY; return NLMISC::KeyNOKEY;
} }
bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text) bool CCocoaEventEmitter::pasteTextFromClipboard(std::string &text)
{ {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; NSArray *classArray = [NSArray arrayWithObject:[NSString class]];
@ -163,17 +163,17 @@ bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text)
{ {
NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options];
NSString *nstext = [objectsToPaste objectAtIndex:0]; NSString *nstext = [objectsToPaste objectAtIndex:0];
text.fromUtf8([nstext UTF8String]); text = [nstext UTF8String];
return true; return true;
} }
return false; return false;
} }
bool CCocoaEventEmitter::copyTextToClipboard(const ucstring &text) bool CCocoaEventEmitter::copyTextToClipboard(const std::string &text)
{ {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents]; [pasteboard clearContents];
NSArray *copiedObjects = [NSArray arrayWithObject:[NSString stringWithUTF8String:text.toUtf8().c_str()]]; NSArray *copiedObjects = [NSArray arrayWithObject:[NSString stringWithUTF8String:text.c_str()]];
[pasteboard writeObjects:copiedObjects]; [pasteboard writeObjects:copiedObjects];
return true; return true;
} }

@ -21,6 +21,7 @@
#ifndef NL_COCOA_EVENT_EMITTER_H #ifndef NL_COCOA_EVENT_EMITTER_H
#define NL_COCOA_EVENT_EMITTER_H #define NL_COCOA_EVENT_EMITTER_H
#include <string.h>
#include "nel/misc/event_emitter.h" #include "nel/misc/event_emitter.h"
#include "nel/misc/event_server.h" #include "nel/misc/event_server.h"
#include "nel/misc/events.h" #include "nel/misc/events.h"
@ -53,8 +54,8 @@ public:
virtual void submitEvents(CEventServer& server, bool allWindows); virtual void submitEvents(CEventServer& server, bool allWindows);
bool handleQuitRequest(); bool handleQuitRequest();
virtual bool copyTextToClipboard(const ucstring &text); virtual bool copyTextToClipboard(const std::string &text);
virtual bool pasteTextFromClipboard(ucstring &text); virtual bool pasteTextFromClipboard(std::string &text);
}; };
} }

@ -331,6 +331,7 @@ bool CDriverUser::getCurrentScreenMode(CMode &mode)
GfxMode gfxMode; GfxMode gfxMode;
bool res= _Driver->getCurrentScreenMode(gfxMode); bool res= _Driver->getCurrentScreenMode(gfxMode);
mode.Windowed= gfxMode.Windowed; mode.Windowed= gfxMode.Windowed;
mode.DisplayDevice= gfxMode.DisplayDevice;
mode.Width= gfxMode.Width; mode.Width= gfxMode.Width;
mode.Height= gfxMode.Height; mode.Height= gfxMode.Height;
mode.Depth= gfxMode.Depth; mode.Depth= gfxMode.Depth;

@ -981,9 +981,10 @@ void CLodCharacterManager::addTextureCompute(CLodCharacterInstance &instance,
return; return;
// get lookup ptr. // get lookup ptr.
nlassert(lodTexture.Texture.size()==NL3D_CLOD_TEXT_SIZE);
if (lodTexture.Texture.size() < NL3D_CLOD_TEXT_SIZE) if (lodTexture.Texture.size() < NL3D_CLOD_TEXT_SIZE)
return; return;
nlassert(lodTexture.Texture.size()==NL3D_CLOD_TEXT_SIZE);
const CLodCharacterTexture::CTUVQ *lookUpPtr= &lodTexture.Texture[0]; const CLodCharacterTexture::CTUVQ *lookUpPtr= &lodTexture.Texture[0];

@ -172,8 +172,6 @@ void CMeshBase::serialMeshBase(NLMISC::IStream &f)
* ***********************************************/ * ***********************************************/
/* /*
Version 10:
- Ryzom Core release check
Version 9: Version 9:
- _CollisionMeshGeneration - _CollisionMeshGeneration
Version 8: Version 8:
@ -196,7 +194,7 @@ void CMeshBase::serialMeshBase(NLMISC::IStream &f)
Version 0: Version 0:
- 1st version. - 1st version.
*/ */
sint ver = f.serialVersion(10); sint ver = f.serialVersion(9);
if (ver >= 2) if (ver >= 2)
{ {

@ -1,5 +1,5 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010-2020 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
@ -1751,7 +1751,7 @@ void CVegetableManager::swapIgRdrPassHardMode(CVegetableInstanceGroup *ig, uin
// *************************************************************************** // ***************************************************************************
void CVegetableManager::setGlobalDensity(float density) void CVegetableManager::setGlobalDensity(float density)
{ {
clamp(density, 0.f, 1.f); clamp(density, 0.f, 100.f);
_GlobalDensity= density; _GlobalDensity= density;
} }

@ -442,8 +442,6 @@ void CZone::serial(NLMISC::IStream &f)
* It can be loaded/called through CAsyncFileManager for instance * It can be loaded/called through CAsyncFileManager for instance
* ***********************************************/ * ***********************************************/
/* /*
Version 5:
- Ryzom Core release check
Version 4: Version 4:
- PointLights - PointLights
Version 3: Version 3:
@ -455,7 +453,7 @@ void CZone::serial(NLMISC::IStream &f)
Version 0: Version 0:
- base verison. - base verison.
*/ */
uint ver= f.serialVersion(5); uint ver= f.serialVersion(4);
// No more compatibility before version 3 // No more compatibility before version 3
if (ver<3) if (ver<3)

@ -0,0 +1,427 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2021 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include <string>
#include "nel/gui/libwww.h"
#include "nel/gui/css_length.h"
#include "nel/gui/css_background.h"
using namespace NLMISC;
#ifdef DEBUG_NEW
#define new DEBUG_NEW
#endif
namespace NLGUI
{
void CSSBackground::setImage(const std::string &value)
{
image = value;
}
void CSSBackground::setPosition(const std::string &value)
{
std::vector<std::string> parts;
splitString(toLowerAscii(value), " ", parts);
if (parts.empty() || parts.size() > 4)
return;
switch(parts.size())
{
case 1:
positionFromOne(parts);
break;
case 2:
positionFromTwo(parts);
break;
case 3:
positionFromThree(parts);
break;
case 4:
positionFromFour(parts);
break;
default:
return;
}
}
void CSSBackground::setSize(const std::string &value)
{
std::vector<std::string> parts;
splitString(toLowerAscii(value), " ", parts);
if (parts.size() > 2)
return;
if (parts.size() == 1 && (parts[0] == "cover" || parts[0] == "contain"))
{
if (parts[0] == "cover")
size = CSS_VALUE_COVER;
else
size = CSS_VALUE_CONTAIN;
width.setAuto();
height.setAuto();
return;
}
// height will default to 'auto' if not set
if (parts.size() == 1)
parts.push_back("auto");
if (parts[0] == "auto" && parts[1] == "auto")
{
size = CSS_VALUE_AUTO;
width.setAuto();
height.setAuto();
return;
}
CSSLength newW, newH;
bool success = true;
if (parts[0] == "auto")
{
newW.setAuto();
}
else
{
float fval;
std::string unit;
if (!getCssLength(fval, unit, parts[0]))
{
nlwarning("Failed to parse background-size[0] '%s'", parts[0].c_str());
return;
}
newW.setFloatValue(fval, unit);
}
if (parts[1] == "auto")
{
newH.setAuto();
}
else
{
float fval;
std::string unit;
if (!getCssLength(fval, unit, parts[1]))
{
nlwarning("Failed to parse background-size[1] '%s'", parts[1].c_str());
return;
}
newH.setFloatValue(fval, unit);
}
size = CSS_VALUE_LENGTH;
width = newW;
height = newH;
}
void CSSBackground::setRepeat(const std::string &value)
{
std::vector<std::string> parts;
splitString(toLowerAscii(value), " ", parts);
if (parts.size() == 0 || parts.size() > 2)
return;
if (parts.size() == 1)
{
if (parts[0] == "repeat-x")
parts.push_back("no-repeat");
else if (parts[0] == "repeat-y")
parts.insert(parts.begin(), "no-repeat");
else //repeat, space, round, no-repeat
parts.push_back(parts[0]);
}
if (parts[0] == "repeat") repeatX = CSS_VALUE_REPEAT;
else if (parts[0] == "no-repeat") repeatX = CSS_VALUE_NOREPEAT;
else if (parts[0] == "space") repeatX = CSS_VALUE_SPACE;
else if (parts[0] == "round") repeatX = CSS_VALUE_ROUND;
else repeatX = CSS_VALUE_REPEAT;
if (parts[1] == "repeat") repeatY = CSS_VALUE_REPEAT;
else if (parts[1] == "no-repeat") repeatY = CSS_VALUE_NOREPEAT;
else if (parts[1] == "space") repeatY = CSS_VALUE_SPACE;
else if (parts[1] == "round") repeatY = CSS_VALUE_ROUND;
else repeatY = CSS_VALUE_REPEAT;
}
void CSSBackground::setOrigin(const std::string &value)
{
if (value == "border-box") origin = CSS_VALUE_BORDER_BOX;
else if (value == "padding-box") origin = CSS_VALUE_PADDING_BOX;
else if (value == "content-box") origin = CSS_VALUE_CONTENT_BOX;
else origin = CSS_VALUE_PADDING_BOX;
}
void CSSBackground::setClip(const std::string &value)
{
if (value == "border-box") clip = CSS_VALUE_BORDER_BOX;
else if (value == "padding-box") clip = CSS_VALUE_PADDING_BOX;
else if (value == "content-box") clip = CSS_VALUE_CONTENT_BOX;
//else if (value == "text") clip = CSSValueType::Text;
else clip = CSS_VALUE_PADDING_BOX;
}
void CSSBackground::setAttachment(const std::string &value)
{
if (value == "fixed") attachment = CSS_VALUE_FIXED;
else if (value == "local") attachment = CSS_VALUE_LOCAL;
else if (value == "scroll") attachment = CSS_VALUE_SCROLL;
else attachment = CSS_VALUE_SCROLL;
}
void CSSBackground::setColor(const std::string &value)
{
NLMISC::CRGBA tmp;
if (scanHTMLColor(value.c_str(), tmp))
color = tmp;
}
static bool isHorizontalKeyword(const std::string &val)
{
return val == "left" || val == "right";
}
static bool isVerticalKeyword(const std::string &val)
{
return val == "top" || val == "bottom";
}
void CSSBackground::positionFromOne(const std::vector<std::string> &parts)
{
CSSValueType newH = CSS_VALUE_LEFT;
CSSValueType newV = CSS_VALUE_TOP;
CSSLength newX, newY;
newX.setFloatValue(0, "%");
newY.setFloatValue(0, "%");
uint index = 0;
float fval;
std::string unit;
if (isHorizontalKeyword(parts[index]))
{
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
newV = CSS_VALUE_CENTER;
}
else if (isVerticalKeyword(parts[index]))
{
newH = CSS_VALUE_CENTER;
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
}
else if (parts[index] == "center")
{
newH = CSS_VALUE_CENTER;
newV = CSS_VALUE_CENTER;
}
else if (getCssLength(fval, unit, parts[index], true))
{
newX.setFloatValue(fval, unit);
newV = CSS_VALUE_CENTER;
}
else
{
return;
}
xAnchor = newH;
yAnchor = newV;
xPosition = newX;
yPosition = newY;
}
void CSSBackground::positionFromTwo(const std::vector<std::string> &parts)
{
CSSValueType newH = CSS_VALUE_LEFT;
CSSValueType newV = CSS_VALUE_TOP;
CSSLength newX, newY;
newX.setFloatValue(0, "%");
newY.setFloatValue(0, "%");
float fval;
std::string unit;
uint index = 0;
bool hasCenter = false;
bool hasX = false;
bool hasY = false;
for (uint index = 0; index < parts.size(); index++)
{
if (parts[index] == "center")
{
hasCenter = true;
}
else if (isHorizontalKeyword(parts[index]))
{
if (hasX) return;
hasX = true;
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
}
else if (isVerticalKeyword(parts[index]))
{
if (hasY) return;
hasY = true;
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
}
else if (getCssLength(fval, unit, parts[index], true))
{
// invalid: 'top 50%';
if (hasY) return;
if (!hasX)
{
hasX = true;
newX.setFloatValue(fval, unit);
}
else
{
hasY = true;
newY.setFloatValue(fval, unit);
}
}
else
{
return;
}
}
if (hasCenter)
{
if (!hasX)
newH = CSS_VALUE_CENTER;
if (!hasY)
newV = CSS_VALUE_CENTER;
}
xAnchor = newH;
yAnchor = newV;
xPosition = newX;
yPosition = newY;
}
void CSSBackground::positionFromThree(const std::vector<std::string> &parts)
{
CSSValueType newH = CSS_VALUE_LEFT;
CSSValueType newV = CSS_VALUE_TOP;
CSSLength newX, newY;
newX.setFloatValue(0, "%");
newY.setFloatValue(0, "%");
float fval;
std::string unit;
bool hasCenter = false;
bool hasX = false;
bool hasY = false;
for(uint index = 0; index < 3; index++)
{
if (parts[index] == "center")
{
if (hasCenter) return;
hasCenter = true;
}
else if (isHorizontalKeyword(parts[index]))
{
if (hasX) return;
hasX = true;
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
if ((index+1) < parts.size() && getCssLength(fval, unit, parts[index+1], true))
{
newX.setFloatValue(fval, unit);
index++;
}
}
else if (isVerticalKeyword(parts[index]))
{
if (hasY) return;
hasY = true;
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
if ((index+1) < parts.size() && getCssLength(fval, unit, parts[index+1], true))
{
newY.setFloatValue(fval, unit);
index++;
}
}
else
{
return;
}
}
if (hasCenter)
{
if (hasX && hasY)
return;
if (!hasX)
newH = CSS_VALUE_CENTER;
else
newV = CSS_VALUE_CENTER;
}
xAnchor = newH;
yAnchor = newV;
xPosition = newX;
yPosition = newY;
}
void CSSBackground::positionFromFour(const std::vector<std::string> &parts)
{
CSSValueType newH = CSS_VALUE_LEFT;
CSSValueType newV = CSS_VALUE_TOP;
CSSLength newX, newY;
newX.setFloatValue(0, "%");
newY.setFloatValue(0, "%");
float fval;
std::string unit;
bool hasX = false;
bool hasY = false;
for(uint index = 0; index<4; index+=2)
{
if (parts[index] == "center")
return;
if (isHorizontalKeyword(parts[index]))
{
if (hasX) return;
hasX = true;
if (!getCssLength(fval, unit, parts[index+1], true)) return;
newH = parts[index] == "left" ? CSS_VALUE_LEFT : CSS_VALUE_RIGHT;
newX.setFloatValue(fval, unit);
}
else if (isVerticalKeyword(parts[index]))
{
if (hasY) return;
hasY = true;
if (!getCssLength(fval, unit, parts[index+1], true)) return;
newV = parts[index] == "top" ? CSS_VALUE_TOP : CSS_VALUE_BOTTOM;
newY.setFloatValue(fval, unit);
}
else
{
return;
}
}
xAnchor = newH;
yAnchor = newV;
xPosition = newX;
yPosition = newY;
}
} // namespace

@ -0,0 +1,597 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2019 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include "nel/gui/css_background_renderer.h"
#include "nel/gui/css_border_renderer.h"
#include "nel/gui/view_renderer.h"
#include "nel/gui/widget_manager.h"
#include "nel/gui/view_bitmap.h"
using namespace std;
using namespace NLMISC;
#ifdef DEBUG_NEW
#define new DEBUG_NEW
#endif
namespace NLGUI
{
// ----------------------------------------------------------------------------
CSSBackgroundRenderer::CSSBackgroundRenderer()
: CurrentAlpha(255), TextureId(-1),
m_BorderX(0), m_BorderY(0), m_BorderW(0), m_BorderH(0),
m_PaddingX(0), m_PaddingY(0), m_PaddingW(0), m_PaddingH(0),
m_ContentX(0), m_ContentY(0), m_ContentW(0), m_ContentH(0),
m_RootFontSize(16.f), m_FontSize(16.f), m_Viewport(NULL),
m_RenderLayer(0), m_ModulateGlobalColor(false), m_FillViewport(false),
m_Dirty(false)
{
}
// ----------------------------------------------------------------------------
CSSBackgroundRenderer::~CSSBackgroundRenderer()
{
if (TextureId != -1)
CViewRenderer::getInstance()->deleteTexture(TextureId);
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::clear()
{
m_Dirty = true;
if (TextureId != -1)
CViewRenderer::getInstance()->deleteTexture(TextureId);
TextureId = -1;
m_Background.image.clear();
m_Background.color.A = 0;
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::setBackground(const CSSBackground &bg)
{
m_Dirty = true;
// TODO: CSSBackground should keep track of TextureId
CViewRenderer &rVR = *CViewRenderer::getInstance();
if (bg.image != m_Background.image && TextureId != -1)
rVR.deleteTexture(TextureId);
m_Background = bg;
// TODO: does not accept urls
if (TextureId == -1 && !bg.image.empty())
{
// TODO: make CViewRenderer accept urls
if (bg.image.find("://") != std::string::npos)
TextureId = rVR.createTexture(bg.image, 0, 0, -1, -1, false);
}
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::setImage(const std::string &bgtex)
{
m_Dirty = true;
// TODO: CSSBackground should keep track of TextureId
CViewRenderer &rVR = *CViewRenderer::getInstance();
if (bgtex != m_Background.image && TextureId != -1)
{
rVR.deleteTexture(TextureId);
TextureId = -1;
}
m_Background.image = bgtex;
if (TextureId == -1 && !bgtex.empty())
{
// TODO: make CViewRenderer accept urls
if (bgtex.find("://") != std::string::npos)
TextureId = rVR.createTexture(bgtex, 0, 0, -1, -1, false);
}
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::setImageRepeat(bool b)
{
m_Background.repeatX = b ? CSS_VALUE_REPEAT : CSS_VALUE_NOREPEAT;
m_Background.repeatY = b ? CSS_VALUE_REPEAT : CSS_VALUE_NOREPEAT;
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::setImageCover(bool b)
{
m_Background.size = b ? CSS_VALUE_COVER : CSS_VALUE_AUTO;
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::updateCoords()
{
m_Dirty = false;
m_DrawQueue.clear();
// TODO: color from last background layer
buildColorQuads(m_Background);
// -------------------------------------------------------------------
// background-image
buildImageQuads(m_Background, TextureId);
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::draw() {
if (m_Dirty) updateCoords();
if (m_DrawQueue.empty()) return;
CViewRenderer &rVR = *CViewRenderer::getInstance();
// flush draw cache to ensure correct draw order
rVR.flush();
// TODO: no need for widget manager, if global color is set from parent
CRGBA globalColor;
if (m_ModulateGlobalColor)
globalColor = CWidgetManager::getInstance()->getGlobalColor();
// TODO: there might be issue on draw order IF using multiple textures
// and second (top) texture is created before first one.
for(uint i = 0; i < m_DrawQueue.size(); ++i)
{
CRGBA color = m_DrawQueue[i].Color;
if (m_ModulateGlobalColor)
color.modulateFromColor (color, globalColor);
color.A = (uint8) (((uint16) CurrentAlpha * (uint16) color.A) >> 8);
rVR.drawQuad(m_RenderLayer, m_DrawQueue[i].Quad, m_DrawQueue[i].TextureId, color, false);
}
// flush draw cache to ensure correct draw order
rVR.flush();
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::getPositioningArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const
{
switch(bg.origin)
{
case CSS_VALUE_PADDING_BOX:
areaX = m_PaddingX;
areaY = m_PaddingY;
areaW = m_PaddingW;
areaH = m_PaddingH;
break;
case CSS_VALUE_CONTENT_BOX:
areaX = m_ContentX;
areaY = m_ContentY;
areaW = m_ContentW;
areaH = m_ContentH;
break;
case CSS_VALUE_BORDER_BOX:
// fall thru
default:
areaX = m_BorderX;
areaY = m_BorderY;
areaW = m_BorderW;
areaH = m_BorderH;
break;
}
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::getPaintingArea(const CSSBackground &bg, sint32 &areaX, sint32 &areaY, sint32 &areaW, sint32 &areaH) const
{
switch(bg.clip)
{
case CSS_VALUE_PADDING_BOX:
areaX = m_PaddingX;
areaY = m_PaddingY;
areaW = m_PaddingW;
areaH = m_PaddingH;
break;
case CSS_VALUE_CONTENT_BOX:
areaX = m_ContentX;
areaY = m_ContentY;
areaW = m_ContentW;
areaH = m_ContentH;
break;
case CSS_VALUE_BORDER_BOX:
// fall thru
default:
areaX = m_BorderX;
areaY = m_BorderY;
areaW = m_BorderW;
areaH = m_BorderH;
break;
}
if (m_FillViewport && m_Viewport)
{
sint32 newX = std::min(areaX, m_Viewport->getXReal());
sint32 newY = std::min(areaY, m_Viewport->getYReal());
areaW = std::max(areaX + areaW, m_Viewport->getXReal() + m_Viewport->getWReal()) - newX;
areaH = std::max(areaY + areaH, m_Viewport->getYReal() + m_Viewport->getHReal()) - newY;
areaX = newX;
areaY = newY;
}
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::calculateSize(const CSSBackground &bg, sint32 &texW, sint32 &texH) const
{
sint32 areaX, areaY, areaW, areaH;
getPositioningArea(bg, areaX, areaY, areaW, areaH);
sint32 vpW=0;
sint32 vpH=0;
if (m_Viewport)
{
vpW = m_Viewport->getWReal();
vpH = m_Viewport->getHReal();
}
float whRatio = (float)texW / (float)texH;
switch(bg.size)
{
case CSS_VALUE_LENGTH:
{
if (bg.width.isAuto() && bg.height.isAuto())
{
// no-op
}
else if (bg.width.isAuto())
{
texH = bg.height.calculate(areaH, m_FontSize, m_RootFontSize, vpW, vpH);
texW = texH * whRatio;
}
else if (bg.height.isAuto())
{
// calculate Height
texW = bg.width.calculate(areaW, m_FontSize, m_RootFontSize, vpW, vpH);
texH = texW / whRatio;
}
else
{
texW = bg.width.calculate(areaW, m_FontSize, m_RootFontSize, vpW, vpH);
texH = bg.height.calculate(areaH, m_FontSize, m_RootFontSize, vpW, vpH);
}
break;
}
case CSS_VALUE_AUTO:
{
// no-op
break;
}
case CSS_VALUE_COVER:
{
float canvasRatio = (float)areaW / (float)areaH;
if (whRatio < canvasRatio)
{
texW = areaW;
texH = areaW / whRatio;
} else {
texW = areaH * whRatio;
texH = areaH;
}
break;
}
case CSS_VALUE_CONTAIN:
{
// same as covert, but ratio check is reversed
float canvasRatio = (float)areaW / (float)areaH;
if (whRatio > canvasRatio)
{
texW = areaW;
texH = areaW / whRatio;
} else {
texW = areaH * whRatio;
texH = areaH;
}
break;
}
}
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::calculatePosition(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH) const
{
sint32 areaX, areaY, areaW, areaH;
getPositioningArea(bg, areaX, areaY, areaW, areaH);
sint32 vpW=0;
sint32 vpH=0;
if (m_Viewport)
{
vpW = m_Viewport->getWReal();
vpH = m_Viewport->getHReal();
}
float ofsX = bg.xPosition.calculate(1, m_FontSize, m_RootFontSize, vpW, vpH);
float ofsY = bg.yPosition.calculate(1, m_FontSize, m_RootFontSize, vpW, vpH);
if (bg.xPosition.isPercent() || bg.xAnchor == CSS_VALUE_CENTER)
{
if (bg.xAnchor == CSS_VALUE_RIGHT)
ofsX = 1.f - ofsX;
else if (bg.xAnchor == CSS_VALUE_CENTER)
ofsX = 0.5f;
ofsX = (float)(areaW - texW) * ofsX;
}
else if (bg.xAnchor == CSS_VALUE_RIGHT)
{
ofsX = areaW - texW - ofsX;
}
// areaY is bottom edge, areaY+areaH is top edge
if (bg.yPosition.isPercent() || bg.yAnchor == CSS_VALUE_CENTER)
{
if (bg.yAnchor == CSS_VALUE_TOP)
ofsY = 1.f - ofsY;
else if (bg.yAnchor == CSS_VALUE_CENTER)
ofsY = 0.5f;
ofsY = (float)(areaH - texH) * ofsY;
}
else if (bg.yAnchor == CSS_VALUE_TOP)
{
ofsY = areaH - texH - ofsY;
}
texX = areaX + ofsX;
texY = areaY + ofsY;
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::getImageTile(sint32 &tilePos, sint32 &tileSize, sint32 &spacing, sint32 &tiles, sint32 areaPos, sint32 areaSize, CSSValueType repeat) const
{
switch(repeat)
{
case CSS_VALUE_NOREPEAT:
{
tiles = 1;
spacing = 0;
break;
}
case CSS_VALUE_SPACE:
{
// if no space for 2+ tiles, then show single one on calculated tilePos
if (tileSize * 2 > areaSize)
{
// set spacing large enough to only display single tile
tiles = 1;
spacing = areaSize;
}
else
{
// available for middle tiles
sint32 midSize = (areaSize - tileSize*2);
// number of middle tiles
sint32 midTiles = midSize / tileSize;
tiles = 2 + midTiles;
tilePos = areaPos;
// int div for floor()
spacing = ( midSize - tileSize * midTiles) / (midTiles + 1);
}
break;
}
case CSS_VALUE_ROUND:
// fall-thru - size is already calculated
case CSS_VALUE_REPEAT:
// fall-thru
default:
{
tilePos -= std::ceil(abs(tilePos - areaPos)/(float)tileSize)*tileSize;
tiles = std::ceil((std::abs(areaPos - tilePos) + areaSize) / (float)tileSize);
spacing = 0;
break;
}
}
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::calculateTiles(const CSSBackground &bg, sint32 &texX, sint32 &texY, sint32 &texW, sint32 &texH, sint32 &tilesX, sint32 &tilesY, sint32 &spacingX, sint32 &spacingY) const
{
sint32 areaX, areaY, areaW, areaH;
getPositioningArea(bg, areaX, areaY, areaW, areaH);
// texX,texY is for position area (ie content-box), but painting area can be bigger (ie border-box)
sint32 paintX, paintY, paintW, paintH;
getPaintingArea(bg, paintX, paintY, paintW, paintH);
if (paintX < areaX)
areaX -= std::ceil((areaX - paintX) / (float)texW) * texW;
if ((paintX + paintW) > (areaX + areaW))
areaW += std::ceil(((paintX + paintW) - (areaX + areaW)) / (float)texW) * texW;
if (paintY < areaY)
areaY -= std::ceil((areaY - paintY) / (float)texH) * texH;
if ((paintY + paintH) > (areaY + areaH))
areaH += std::ceil(((paintY + paintH) - (areaY + areaH)) / (float)texH) * texH;
if (texW <= 0 || texH <= 0 || areaW <= 0 || areaH <= 0)
{
tilesX = tilesY = 0;
spacingX = spacingY = 0;
return;
}
if (bg.repeatX == CSS_VALUE_ROUND)
{
sint numTiles = std::max(1, (sint)std::round((float)areaW / texW));
texW = areaW / numTiles;
if (bg.height.isAuto() && bg.repeatY != CSS_VALUE_ROUND)
{
float aspect = (float)areaW / (numTiles * texW);
texH = texW * aspect;
}
}
if (bg.repeatY == CSS_VALUE_ROUND)
{
sint numTiles = std::max(1, (sint)std::round((float)areaH / texH));
texH = areaH / numTiles;
if (bg.width.isAuto() && bg.repeatX != CSS_VALUE_ROUND)
{
float aspect = (float)areaH / (numTiles * texH);
texW = texH * aspect;
}
}
getImageTile(texX, texW, spacingX, tilesX, areaX, areaW, bg.repeatX);
getImageTile(texY, texH, spacingY, tilesY, areaY, areaH, bg.repeatY);
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::buildColorQuads(const CSSBackground &bg)
{
if (bg.color.A == 0)
return;
// painting area defined with background-clip
sint32 x, y, w, h;
getPaintingArea(bg, x, y, w, h);
if (w <= 0 || h <= 0)
return;
CViewRenderer &rVR = *CViewRenderer::getInstance();
SDrawQueue shape;
shape.Quad.Uv0.set(0.f, 1.f);
shape.Quad.Uv1.set(1.f, 1.f);
shape.Quad.Uv2.set(1.f, 0.f);
shape.Quad.Uv3.set(0.f, 0.f);
shape.Quad.V0.set(x, y, 0);
shape.Quad.V1.set(x+w, y, 0);
shape.Quad.V2.set(x+w, y+h, 0);
shape.Quad.V3.set(x, y+h, 0);
shape.Color = bg.color;
shape.TextureId = rVR.getBlankTextureId();
m_DrawQueue.push_back(shape);
}
// ----------------------------------------------------------------------------
void CSSBackgroundRenderer::buildImageQuads(const CSSBackground &bg, sint32 textureId)
{
// TODO: m_Background should have textureId and that should be "reserved" in CViewRenderer
// even before download is finished
if (textureId < 0)
return;
CViewRenderer &rVR = *CViewRenderer::getInstance();
sint32 texW = 0;
sint32 texH = 0;
rVR.getTextureSizeFromId(textureId, texW, texH);
if (texW <= 0 || texH <= 0)
return;
// get requested texture size
calculateSize(m_Background, texW, texH);
if(texW <= 0 || texH <= 0)
return;
// get texture left/top corner
sint32 texX, texY;
calculatePosition(m_Background, texX, texY, texW, texH);
sint32 tilesX, tilesY;
sint32 spacingX, spacingY;
calculateTiles(m_Background, texX, texY, texW, texH, tilesX, tilesY, spacingX, spacingY);
sint32 clipL, clipB, clipR, clipT;
getPaintingArea(m_Background, clipL, clipB, clipR, clipT);
clipR += clipL;
clipT += clipB;
m_DrawQueue.reserve(tilesX * tilesY + m_DrawQueue.size());
for(sint32 tileX = 0; tileX < tilesX; tileX++)
{
for(sint32 tileY = 0; tileY < tilesY; tileY++)
{
sint32 tileL = texX + tileX * (texW + spacingX);
sint32 tileB = texY + tileY * (texH + spacingY);
sint32 tileR = tileL + texW;
sint32 tileT = tileB + texH;
// tile is outside clip area
if (tileT <= clipB || tileB >= clipT || tileR <= clipL || tileL >= clipR)
continue;
CUV uv0(0,1);
CUV uv1(1,1);
CUV uv2(1,0);
CUV uv3(0,0);
// clip if tile not totally inside clip area
if (!(tileL >= clipL && tileR <= clipR && tileB >= clipB && tileT <= clipT))
{
float ratio;
if (tileL < clipL)
{
ratio = ((float)(clipL - tileL))/((float)(tileR - tileL));
tileL = clipL;
uv0.U += ratio*(uv1.U-uv0.U);
uv3.U += ratio*(uv2.U-uv3.U);
}
if (tileB < clipB)
{
ratio = ((float)(clipB - tileB))/((float)(tileT - tileB));
tileB = clipB;
uv0.V += ratio*(uv3.V-uv0.V);
uv1.V += ratio*(uv2.V-uv1.V);
}
if (tileR > clipR)
{
ratio = ((float)(clipR - tileR))/((float)(tileL - tileR));
tileR = clipR;
uv2.U += ratio*(uv3.U-uv2.U);
uv1.U += ratio*(uv0.U-uv1.U);
}
if (tileT > clipT)
{
ratio = ((float)(clipT - tileT))/((float)(tileB - tileT));
tileT = clipT;
uv2.V += ratio*(uv1.V-uv2.V);
uv3.V += ratio*(uv0.V-uv3.V);
}
}
SDrawQueue shape;
shape.Quad.Uv0 = uv0;
shape.Quad.Uv1 = uv1;
shape.Quad.Uv2 = uv2;
shape.Quad.Uv3 = uv3;
shape.Color = CRGBA::White;
shape.TextureId = textureId;
shape.Quad.V0.set(tileL, tileB, 0);
shape.Quad.V1.set(tileR, tileB, 0);
shape.Quad.V2.set(tileR, tileT, 0);
shape.Quad.V3.set(tileL, tileT, 0);
m_DrawQueue.push_back(shape);
}
}
}
}//namespace

@ -29,290 +29,718 @@ using namespace NLMISC;
namespace NLGUI namespace NLGUI
{ {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
CSSBorderRenderer::CSSBorderRenderer() CSSBorderRenderer::CSSBorderRenderer()
{ {
TopWidth = RightWidth = BottomWidth = LeftWidth = 0;
TopColor = RightColor = BottomColor = LeftColor = CRGBA(128, 128, 128, 255);
TopStyle = RightStyle = BottomStyle = LeftStyle = CSS_LINE_STYLE_SOLID;
CurrentAlpha = 255; CurrentAlpha = 255;
_RenderLayer = 0; m_Scale = 1.f;
_ModulateGlobalColor = false; m_RenderLayer = 0;
m_ModulateGlobalColor = false;
_Border = true;
_Dirty = true; m_Dirty = true;
_BorderTop = _BorderRight = _BorderBottom = _BorderLeft = false; m_MustComputeValues = true;
m_XReal = 0;
// m_YReal = 0;
_QuadT.Uv0.set(0.f, 0.f); m_WReal = 0;
_QuadT.Uv1.set(0.f, 0.f); m_HReal = 0;
_QuadT.Uv2.set(1.f, 1.f);
_QuadT.Uv3.set(0.f, 1.f); m_Viewport = NULL;
// m_FontSize = 16.f;
_QuadR.Uv0.set(0.f, 0.f); m_RootFontSize = 16.f;
_QuadR.Uv1.set(0.f, 0.f);
_QuadR.Uv2.set(1.f, 1.f); m_Computed.Top = m_Computed.Right = m_Computed.Bottom = m_Computed.Left = 0;
_QuadR.Uv3.set(0.f, 1.f);
//
_QuadB.Uv0.set(0.f, 0.f);
_QuadB.Uv1.set(0.f, 0.f);
_QuadB.Uv2.set(1.f, 1.f);
_QuadB.Uv3.set(0.f, 1.f);
//
_QuadL.Uv0.set(0.f, 0.f);
_QuadL.Uv1.set(0.f, 0.f);
_QuadL.Uv2.set(1.f, 1.f);
_QuadL.Uv3.set(0.f, 1.f);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::setRenderLayer(sint layer) void CSSBorderRenderer::setRenderLayer(sint layer)
{ {
_RenderLayer = layer; m_RenderLayer = layer;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::setModulateGlobalColor(bool s) void CSSBorderRenderer::setModulateGlobalColor(bool s)
{ {
_ModulateGlobalColor = s; m_ModulateGlobalColor = s;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::setRect(sint32 x, sint32 y, sint32 w, sint32 h) void CSSBorderRenderer::setRect(sint32 x, sint32 y, sint32 w, sint32 h)
{ {
_XReal = x; m_XReal = x;
_YReal = y; m_YReal = y;
_WReal = w; m_WReal = w;
_HReal = h; m_HReal = h;
_Dirty = _Border = (w > 0 && h > 0); m_Dirty = (w > 0 && h > 0);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::setWidth(uint32 top, uint32 right, uint32 bottom, uint32 left) bool CSSBorderRenderer::hasInnerShape(CSSLineStyle style) const
{ {
TopWidth = top; return style == CSS_LINE_STYLE_DOUBLE ||
RightWidth = right; style == CSS_LINE_STYLE_GROOVE ||
BottomWidth = bottom; style == CSS_LINE_STYLE_RIDGE;
LeftWidth = left;
_Dirty = _Border = (top > 0 || right > 0 || bottom > 0 || left > 0);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::setStyle(CSSLineStyle top, CSSLineStyle right, CSSLineStyle bottom, CSSLineStyle left) void CSSBorderRenderer::computeValues()
{ {
TopStyle = top; m_MustComputeValues = false;
RightStyle = right;
BottomStyle = bottom;
LeftStyle = left;
_Dirty = _Border = true; // TODO :should save as computed value
sint32 vpW=0;
sint32 vpH=0;
if (m_Viewport)
{
vpW = m_Viewport->getWReal();
vpH = m_Viewport->getHReal();
}
m_Computed.Top = m_Border.Top.empty() ? 0 : m_Border.Top.Width.calculate(0, m_FontSize, m_RootFontSize, vpW, vpH);
m_Computed.Right = m_Border.Right.empty() ? 0 : m_Border.Right.Width.calculate(0, m_FontSize, m_RootFontSize, vpW, vpH);
m_Computed.Bottom = m_Border.Bottom.empty() ? 0 : m_Border.Bottom.Width.calculate(0, m_FontSize, m_RootFontSize, vpW, vpH);
m_Computed.Left = m_Border.Left.empty() ? 0 : m_Border.Left.Width.calculate(0, m_FontSize, m_RootFontSize, vpW, vpH);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::setColor(const NLMISC::CRGBA &top, const NLMISC::CRGBA &right, const NLMISC::CRGBA &bottom, const NLMISC::CRGBA &left) void CSSBorderRenderer::getAdjacentBorders(EBorderSide side, EBorderSide &adjBorderL, EBorderSide &adjBorderR) const
{ {
TopColor = top; switch(side)
RightColor = right; {
BottomColor = bottom; case BORDER_TOP:
LeftColor = left; adjBorderL = BORDER_TOP_LEFT;
adjBorderR = BORDER_TOP_RIGHT;
break;
case BORDER_RIGHT:
adjBorderL = BORDER_RIGHT_BOTTOM;
adjBorderR = BORDER_RIGHT_TOP;
break;
case BORDER_BOTTOM:
adjBorderL = BORDER_BOTTOM_LEFT;
adjBorderR = BORDER_BOTTOM_RIGHT;
break;
case BORDER_LEFT:
adjBorderL = BORDER_LEFT_BOTTOM;
adjBorderR = BORDER_LEFT_TOP;
break;
default:
adjBorderL = adjBorderR = BORDER_INVALID;
break;
}
}
_Dirty = true; // ----------------------------------------------------------------------------
void CSSBorderRenderer::getAdjacentBorderWidth(EBorderSide side, sint32 &adjWidthL, sint32 &adjWidthR) const
{
switch(side)
{
case BORDER_TOP:
case BORDER_BOTTOM:
adjWidthL = m_Computed.Left;
adjWidthR = m_Computed.Right;
break;
case BORDER_LEFT:
case BORDER_RIGHT:
adjWidthL = m_Computed.Bottom;
adjWidthR = m_Computed.Top;
break;
default:
adjWidthL = adjWidthR = 0;
break;
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
uint32 CSSBorderRenderer::getTopWidth() const void CSSBorderRenderer::buildDotCornerStart(EBorderSide side, SDrawBorder shape, float x1, float y1, float radius)
{ {
if (TopStyle == CSS_LINE_STYLE_NONE || TopStyle == CSS_LINE_STYLE_HIDDEN) NLMISC::CLine line;
return 0; switch(side)
{
case BORDER_TOP:
line.V0.set(m_XReal + m_Computed.Left, m_YReal + m_HReal - m_Computed.Top, 0);
line.V1.set(m_XReal, m_YReal + m_HReal, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
case BORDER_RIGHT:
line.V0.set(m_XReal + m_WReal, m_YReal, 0);
line.V1.set(m_XReal + m_WReal - m_Computed.Right, m_YReal + m_Computed.Bottom, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
case BORDER_BOTTOM:
line.V0.set(m_XReal, m_YReal, 0);
line.V1.set(m_XReal + m_Computed.Left, m_YReal + m_Computed.Bottom, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
case BORDER_LEFT:
line.V0.set(m_XReal + m_Computed.Left, m_YReal + m_Computed.Bottom, 0);
line.V1.set(m_XReal, m_YReal, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
}
}
return TopWidth; // ----------------------------------------------------------------------------
void CSSBorderRenderer::buildDotCornerEnd(EBorderSide side, SDrawBorder shape, float x1, float y1, float radius)
{
NLMISC::CLine line;
switch(side)
{
case BORDER_TOP:
line.V0.set(m_XReal + m_WReal, m_YReal + m_HReal, 0);
line.V1.set(m_XReal + m_WReal - m_Computed.Right, m_YReal + m_HReal - m_Computed.Top, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
case BORDER_RIGHT:
line.V0.set(m_XReal + m_WReal - m_Computed.Right, m_YReal + m_HReal - m_Computed.Top, 0);
line.V1.set(m_XReal + m_WReal, m_YReal + m_HReal, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
case BORDER_BOTTOM:
line.V0.set(m_XReal + m_WReal - m_Computed.Right, m_YReal + m_Computed.Bottom, 0);
line.V1.set(m_XReal + m_WReal, m_YReal, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
case BORDER_LEFT:
line.V0.set(m_XReal, m_YReal + m_HReal, 0);
line.V1.set(m_XReal + m_Computed.Left, m_YReal + m_HReal - m_Computed.Top, 0);
buildDotCorner(shape, x1, y1, radius, line);
break;
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
uint32 CSSBorderRenderer::getRightWidth() const void CSSBorderRenderer::buildDashedBorder(EBorderSide side)
{ {
if (RightStyle == CSS_LINE_STYLE_NONE || RightStyle == CSS_LINE_STYLE_HIDDEN) CSSBorder border;
return 0;
return RightWidth; float x, y;
bool horizontal;
sint32 width, thickness;
switch(side)
{
case BORDER_TOP:
horizontal = true;
border = m_Border.Top;
width = m_WReal;
thickness = m_Computed.Top;
x = m_XReal;
y = m_YReal + m_HReal - thickness;
break;
case BORDER_RIGHT:
horizontal = false;
border = m_Border.Right;
width = m_HReal;
thickness = m_Computed.Right;
x = m_XReal + m_WReal - thickness;
y = m_YReal;
break;
case BORDER_BOTTOM:
horizontal = true;
border = m_Border.Bottom;
width = m_WReal;
thickness = m_Computed.Bottom;
x = m_XReal;
y = m_YReal;
break;
case BORDER_LEFT:
horizontal = false;
border = m_Border.Left;
width = m_HReal;
thickness = m_Computed.Left;
x = m_XReal;
y = m_YReal;
break;
default:
return;
}
if (width < 1) return;
if (thickness < 1) return;
SDrawBorder shape;
shape.Color = border.Color;
shape.Quad.Uv0.set(0.f, 0.f);
shape.Quad.Uv1.set(1.f, 0.f);
shape.Quad.Uv2.set(1.f, 1.f);
shape.Quad.Uv3.set(0.f, 1.f);
EBorderSide adjBorderL, adjBorderR;
getAdjacentBorders(side, adjBorderL, adjBorderR);
sint32 adjWidthL, adjWidthR;
getAdjacentBorderWidth(side, adjWidthL, adjWidthR);
// get alias to x/y
float &xy = horizontal ? x : y;
if (border.Style == CSS_LINE_STYLE_DOTTED)
{
// thick border with little or no content might try to draw larger dot that fits
float radius = std::min(thickness / 2.f, width / 2.f);
float dot = thickness;
sint32 count = std::floor((float)width / dot);
// 3n (dot, gap, dot) groups; count should be odd
if ((count % 2) == 0) count += 1;
if (count == 1)
{
// fallback to single dot
if (horizontal)
{
x += width / 2.f;
y += radius;
}
else
{
x += radius;
y += width / 2.f;
}
buildDotSegments(shape, x, y, radius);
return;
}
// center-to-center spacing for dots
float spacing = dot + (width - dot * count) / (count-1);
x += radius;
y += radius;
if (adjWidthL > 0)
buildDotCornerStart(side, shape, x, y, radius);
else
buildDotSegments(shape, x, y, radius);
xy += spacing;
count--;
if (adjWidthR > 0)
count--;
bool isDot = false;
while(count > 0)
{
if (isDot)
buildDotSegments(shape, x, y, radius);
isDot = !isDot;
xy += spacing;
count--;
}
if (adjWidthR > 0)
buildDotCornerEnd(side, shape, x, y, radius);
}
else
{
sint32 innerWidth = width;
if (adjWidthL > 0) innerWidth -= adjWidthL;
if (adjWidthR > 0) innerWidth -= adjWidthR;
sint32 count = std::floor((float)innerWidth * 2.f / (thickness * 3));
if ((float)innerWidth < 2.f * thickness)
{
buildSolidBorder(side);
return;
}
// 4n groups (halfDash, halfGap, halfGap, halfDash)
if ((count % 4) == 1) count += 3;
else if ((count % 4) == 2) count += 2;
else if ((count % 4) == 3) count += 1;
float halfDash = (float)innerWidth / (float)count;
float fullDash = halfDash * 2.f;
// draw half dash or full corner
makeBorderQuad(side, shape, x, y, adjWidthL + halfDash, thickness);
if (adjWidthL > 0)
makeCornerQuad(adjBorderL, shape);
m_DrawBorders.push_back(shape);
xy += adjWidthL + halfDash;
// start/end half dash that are merged with corners
count -= 2;
bool isDash = false;
while(count > 0)
{
if (isDash)
{
makeBorderQuad(side, shape, x, y, fullDash, thickness);
m_DrawBorders.push_back(shape);
}
isDash = !isDash;
xy += fullDash;
count -= 2;
}
// draw half dash or full corner
makeBorderQuad(side, shape, x, y, adjWidthR + halfDash, thickness);
if (adjWidthR > 0)
makeCornerQuad(adjBorderR, shape);
m_DrawBorders.push_back(shape);
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
uint32 CSSBorderRenderer::getBottomWidth() const void CSSBorderRenderer::buildSolidBorder(EBorderSide side)
{ {
if (BottomStyle == CSS_LINE_STYLE_NONE || BottomStyle == CSS_LINE_STYLE_HIDDEN) float x, y;
return 0; sint width, thickness;
CSSBorder border;
switch(side)
{
case BORDER_TOP:
border = m_Border.Top;
width = m_WReal;
thickness = m_Computed.Top;
x = m_XReal;
y = m_YReal + m_HReal - thickness;
break;
case BORDER_RIGHT:
border = m_Border.Right;
width = m_HReal;
thickness = m_Computed.Right;
x = m_XReal + m_WReal - thickness;
y = m_YReal;
break;
case BORDER_BOTTOM:
border = m_Border.Bottom;
width = m_WReal;
thickness = m_Computed.Bottom;
x = m_XReal;
y = m_YReal;
break;
case BORDER_LEFT:
border = m_Border.Left;
width = m_HReal;
thickness = m_Computed.Left;
x = m_XReal;
y = m_YReal;
break;
default:
return;
}
SDrawBorder shape;
shape.Color = border.Color;
shape.Quad.Uv0.set(0.f, 0.f);
shape.Quad.Uv1.set(1.f, 0.f);
shape.Quad.Uv2.set(1.f, 1.f);
shape.Quad.Uv3.set(0.f, 1.f);
if (border.Style == CSS_LINE_STYLE_INSET && (side == BORDER_TOP || side == BORDER_LEFT))
shape.Color = blend(border.Color, CRGBA::Black, 0.5f);
else if (border.Style == CSS_LINE_STYLE_OUTSET && (side == BORDER_BOTTOM || side == BORDER_RIGHT))
shape.Color = blend(border.Color, CRGBA::Black, 0.5f);
// solid border
{
EBorderSide adjBorderL, adjBorderR;
getAdjacentBorders(side, adjBorderL, adjBorderR);
makeBorderQuad(side, shape, x, y, width, thickness);
makeCornerQuad(adjBorderL, shape);
makeCornerQuad(adjBorderR, shape);
return BottomWidth; m_DrawBorders.push_back(shape);
}
if (hasInnerShape(border.Style))
{
if (side == BORDER_TOP || side == BORDER_LEFT)
{
if (border.Style == CSS_LINE_STYLE_GROOVE)
m_DrawBorders.back().Color = blend(border.Color, CRGBA::Black, 0.5f);
else if (border.Style == CSS_LINE_STYLE_RIDGE)
shape.Color = blend(border.Color, CRGBA::Black, 0.5f);
}
else if (side == BORDER_BOTTOM || side == BORDER_RIGHT)
{
if (border.Style == CSS_LINE_STYLE_GROOVE)
shape.Color = blend(border.Color, CRGBA::Black, 0.5f);
else if (border.Style == CSS_LINE_STYLE_RIDGE)
m_DrawBorders.back().Color = blend(border.Color, CRGBA::Black, 0.5f);
}
sint32 adjWidthL, adjWidthR;
getAdjacentBorderWidth(side, adjWidthL, adjWidthR);
float iStart, iMiddle, iEnd;
if (border.Style == CSS_LINE_STYLE_DOUBLE)
{
iStart = 2 * adjWidthL / 3.f;
iMiddle = 2 * thickness / 3.f;
iEnd = 2 * adjWidthR / 3.f;
} else {
iStart = adjWidthL / 2.f;
iMiddle = thickness / 2.f;
iEnd = adjWidthR / 2.f;
}
// create inner shape and remove overlapping from outer shape
switch(side)
{
case BORDER_TOP:
m_DrawBorders.back().Quad.V0.x -= iStart; m_DrawBorders.back().Quad.V0.y += iMiddle;
m_DrawBorders.back().Quad.V1.x += iEnd; m_DrawBorders.back().Quad.V1.y += iMiddle;
shape.Quad.V3.x += iStart; shape.Quad.V3.y -= iMiddle;
shape.Quad.V2.x -= iEnd; shape.Quad.V2.y -= iMiddle;
break;
case BORDER_BOTTOM:
m_DrawBorders.back().Quad.V2.x += iEnd; m_DrawBorders.back().Quad.V2.y -= iMiddle;
m_DrawBorders.back().Quad.V3.x -= iStart; m_DrawBorders.back().Quad.V3.y -= iMiddle;
shape.Quad.V1.x -= iEnd; shape.Quad.V1.y += iMiddle;
shape.Quad.V0.x += iStart; shape.Quad.V0.y += iMiddle;
break;
case BORDER_RIGHT:
m_DrawBorders.back().Quad.V3.x += iMiddle; m_DrawBorders.back().Quad.V3.y += iEnd;
m_DrawBorders.back().Quad.V0.x += iMiddle; m_DrawBorders.back().Quad.V0.y -= iStart;
shape.Quad.V2.x -= iMiddle; shape.Quad.V2.y -= iEnd;
shape.Quad.V1.x -= iMiddle; shape.Quad.V1.y += iStart;
break;
case BORDER_LEFT:
m_DrawBorders.back().Quad.V2.x -= iMiddle; m_DrawBorders.back().Quad.V2.y += iEnd;
m_DrawBorders.back().Quad.V1.x -= iMiddle; m_DrawBorders.back().Quad.V1.y -= iStart;
shape.Quad.V3.x += iMiddle; shape.Quad.V3.y -= iEnd;
shape.Quad.V0.x += iMiddle; shape.Quad.V0.y += iStart;
break;
}
m_DrawBorders.push_back(shape);
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
uint32 CSSBorderRenderer::getLeftWidth() const void CSSBorderRenderer::makeBorderQuad(EBorderSide side, SDrawBorder &shape, float x, float y, float width, float thickness) const
{ {
if (LeftStyle == CSS_LINE_STYLE_NONE || LeftStyle == CSS_LINE_STYLE_HIDDEN) float quadW, quadH;
return 0; switch(side)
{
case BORDER_TOP: quadW = width; quadH = thickness; break;
case BORDER_BOTTOM:quadW = width; quadH = thickness; break;
case BORDER_LEFT: quadW = thickness; quadH = width; break;
case BORDER_RIGHT: quadW = thickness; quadH = width; break;
default: return;
}
shape.Quad.V3.x = x; shape.Quad.V3.y = y + quadH;
shape.Quad.V2.x = x + quadW; shape.Quad.V2.y = y + quadH;
shape.Quad.V1.x = x + quadW; shape.Quad.V1.y = y;
shape.Quad.V0.x = x; shape.Quad.V0.y = y;
}
return LeftWidth; // ----------------------------------------------------------------------------
void CSSBorderRenderer::makeCornerQuad(EBorderSide side, SDrawBorder &shape) const
{
switch(side)
{
case BORDER_TOP_LEFT: shape.Quad.V0.x += m_Computed.Left; break;
case BORDER_TOP_RIGHT: shape.Quad.V1.x -= m_Computed.Right; break;
case BORDER_RIGHT_TOP: shape.Quad.V3.y -= m_Computed.Top; break;
case BORDER_RIGHT_BOTTOM: shape.Quad.V0.y += m_Computed.Bottom; break;
case BORDER_BOTTOM_LEFT: shape.Quad.V3.x += m_Computed.Left; break;
case BORDER_BOTTOM_RIGHT: shape.Quad.V2.x -= m_Computed.Right; break;
case BORDER_LEFT_TOP: shape.Quad.V2.y -= m_Computed.Top; break;
case BORDER_LEFT_BOTTOM: shape.Quad.V1.y += m_Computed.Bottom; break;
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
uint32 CSSBorderRenderer::getLeftRightWidth() const static bool getCircleLineIntersection(float x, float y, float r, const NLMISC::CLine &line, NLMISC::CLine &result)
{ {
return getLeftWidth() + getRightWidth(); float dx = line.V0.x - line.V1.x;
float dy = line.V0.y - line.V1.y;
float rx = line.V0.x-x;
float ry = line.V0.y-y;
float a = dx*dx + dy*dy;
float b = 2*(dx * rx + dy * ry);
float c = rx * rx + ry * ry - r*r;
float d = b*b - 4 * a * c;
if (d < 0)
return false;
if (d == 0)
{
// single intersection
//float t = -b / (2*a);
//result.V0.x = result.V1.x = line.V0.x + t * dx;
//result.V0.y = result.V1.y = line.V0.y + t * dy;
return false;
}
float t;
t = (-b + sqrt(d)) / (2 * a);
result.V0.x = line.V0.x + t * dx;
result.V0.y = line.V0.y + t * dy;
t = (-b - sqrt(d)) / (2 * a);
result.V1.x = line.V0.x + t * dx;
result.V1.y = line.V0.y + t * dy;
return true;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
uint32 CSSBorderRenderer::getTopBottomWidth() const void CSSBorderRenderer::buildDotCorner(SDrawBorder shape, float cX, float cY, float cR, const NLMISC::CLine &line)
{ {
return getTopWidth() + getBottomWidth(); static const float twopi = 2 * NLMISC::Pi;
NLMISC::CLine out;
if (getCircleLineIntersection(cX, cY, cR, line, out))
{
float fromAngle = std::atan2(out.V0.y - cY, out.V0.x - cX);
float toAngle = std::atan2(out.V1.y - cY, out.V1.x - cX);
if (fromAngle < 0) fromAngle += twopi;
if (toAngle < 0) toAngle += twopi;
fromAngle /= twopi;
toAngle /= twopi;
buildDotSegments(shape, cX, cY, cR, fromAngle, toAngle);
} else {
buildDotSegments(shape, cX, cY, cR);
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::updateCoords() void CSSBorderRenderer::buildDotSegments(SDrawBorder shape, float x, float y, float radius, float fromAngle, float toAngle)
{ {
_Dirty = false; static const float pi = (float)NLMISC::Pi;
if (!_Border) return; static const float twopi = (float)(NLMISC::Pi * 2);
static const uint minSectors = 12;
// use single quad if dot is small
if (2 * radius * m_Scale < 4)
{
makeBorderQuad(BORDER_TOP, shape, x - radius, y - radius, radius * 2, radius * 2);
m_DrawBorders.push_back(shape);
return;
}
// number of sectors for full circle
uint sectors = std::max(minSectors, (uint)std::ceil(radius * m_Scale));
sint dTop = getTopWidth(); _BorderTop = dTop > 0; float arcLength;
sint dRight = getRightWidth(); _BorderRight = dRight > 0; if (toAngle < fromAngle)
sint dBottom = getBottomWidth(); _BorderBottom = dBottom > 0; arcLength = twopi * (1 + toAngle - fromAngle);
sint dLeft = getLeftWidth(); _BorderLeft = dLeft > 0; else
arcLength = twopi * (toAngle - fromAngle);
_Border = _BorderTop || _BorderRight || _BorderBottom || _BorderLeft; // sectors to draw
if (!_Border) return; float arcSectors = ceil(arcLength * sectors / twopi );
float arcSectorLength = arcLength / arcSectors;
if (_BorderTop) if (arcSectors <= 1)
return;
if (arcLength < pi)
{ {
// top-left // only small segment is visible
_QuadT.V3.x = _XReal; float px1 = x + radius * cosf(twopi * fromAngle);
_QuadT.V3.y = _YReal + _HReal; float py1 = y + radius * sinf(twopi * fromAngle);
// top-right float px2 = x + radius * cosf(twopi * toAngle);
_QuadT.V2.x = _XReal + _WReal; float py2 = y + radius * sinf(twopi * toAngle);
_QuadT.V2.y = _YReal + _HReal; float cx = (px1 + px2) / 2.f;
// bottom-right float cy = (py1 + py2) / 2.f;
_QuadT.V1.x = _XReal + _WReal - dRight; shape.Quad.V0.x = cx; shape.Quad.V0.y = cy;
_QuadT.V1.y = _YReal + _HReal - dTop; shape.Quad.V1.x = cx; shape.Quad.V1.y = cy;
// bottom-left
_QuadT.V0.x = _XReal + dLeft;
_QuadT.V0.y = _YReal + _HReal - dTop;
} }
else
if (_BorderRight)
{ {
// top-left shape.Quad.V0.x = x; shape.Quad.V0.y = y;
_QuadR.V3.x = _XReal + _WReal - dRight; shape.Quad.V1.x = x; shape.Quad.V1.y = y;
_QuadR.V3.y = _YReal + _HReal - dTop;
// top-right
_QuadR.V2.x = _XReal + _WReal;
_QuadR.V2.y = _YReal + _HReal;
// bottom-right
_QuadR.V1.x = _XReal + _WReal;
_QuadR.V1.y = _YReal;
// bottom-left
_QuadR.V0.x = _XReal + _WReal - dRight;
_QuadR.V0.y = _YReal + dBottom;
} }
if (_BorderBottom) float a1 = fromAngle * twopi;
uint step;
for(step = 0; step < (uint)arcSectors; step++)
{ {
// top-left float a2 = a1 + arcSectorLength;
_QuadB.V3.x = _XReal + dLeft;
_QuadB.V3.y = _YReal + dBottom; shape.Quad.V2.x = x + radius * cosf(a1); shape.Quad.V2.y = y + radius * sinf(a1);
// top-right shape.Quad.V3.x = x + radius * cosf(a2); shape.Quad.V3.y = y + radius * sinf(a2);
_QuadB.V2.x = _XReal + _WReal - dRight;
_QuadB.V2.y = _YReal + dBottom; m_DrawBorders.push_back(shape);
// bottom-right
_QuadB.V1.x = _XReal + _WReal; a1 = a2;
_QuadB.V1.y = _YReal;
// bottom-left
_QuadB.V0.x = _XReal;
_QuadB.V0.y = _YReal;
} }
if (_BorderLeft) // build last sector if requested range is over 180deg
if (arcLength > pi && arcLength < twopi)
{ {
// top-left float a2 = fromAngle * twopi;
_QuadL.V3.x = _XReal; shape.Quad.V2.x = x + radius * cosf(a1); shape.Quad.V2.y = y + radius * sinf(a1);
_QuadL.V3.y = _YReal + _HReal; shape.Quad.V3.x = x + radius * cosf(a2); shape.Quad.V3.y = y + radius * sinf(a2);
// top-right m_DrawBorders.push_back(shape);
_QuadL.V2.x = _XReal + dLeft;
_QuadL.V2.y = _YReal + _HReal - dTop;
// bottom-right
_QuadL.V1.x = _XReal + dLeft;
_QuadL.V1.y = _YReal + dBottom;
// bottom-left
_QuadL.V0.x = _XReal;
_QuadL.V0.y = _YReal;
} }
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CSSBorderRenderer::draw() { void CSSBorderRenderer::updateCoords()
if (_Dirty) updateCoords(); {
if (!_Border) return; m_Dirty = false;
m_DrawBorders.clear();
CViewRenderer &rVR = *CViewRenderer::getInstance();
// TODO: no need for widget manager, if global color is set from parent if (m_MustComputeValues)
CRGBA globalColor; computeValues();
if (_ModulateGlobalColor)
globalColor = CWidgetManager::getInstance()->getGlobalColor();
// TODO: monitor ModulateGlobalColor and CurrentAlpha in table checkCoords and recalculate colors on change only if (m_Computed.Top > 0 && m_Border.Top.Color.A > 0)
// OUTSET - bottom/right darker than normal (default table style)
// INSET - top/left darker than normal
if (_BorderTop)
{ {
CRGBA borderColorT = TopColor; if (m_Border.Top.Style == CSS_LINE_STYLE_DASHED || m_Border.Top.Style == CSS_LINE_STYLE_DOTTED)
if (TopStyle == CSS_LINE_STYLE_INSET) buildDashedBorder(BORDER_TOP);
borderColorT = blend(borderColorT, CRGBA::Black, 0.5f); else
buildSolidBorder(BORDER_TOP);
}
if (_ModulateGlobalColor) if (m_Computed.Bottom > 0 && m_Border.Bottom.Color.A > 0)
borderColorT.modulateFromColor (borderColorT, globalColor); {
if (m_Border.Bottom.Style == CSS_LINE_STYLE_DASHED || m_Border.Bottom.Style == CSS_LINE_STYLE_DOTTED)
buildDashedBorder(BORDER_BOTTOM);
else
buildSolidBorder(BORDER_BOTTOM);
}
borderColorT.A = (uint8) (((uint16) CurrentAlpha * (uint16) borderColorT.A) >> 8); if (m_Computed.Right > 0 && m_Border.Right.Color.A > 0)
rVR.drawQuad(_RenderLayer, _QuadT, rVR.getBlankTextureId(), borderColorT, false); {
if (m_Border.Right.Style == CSS_LINE_STYLE_DASHED || m_Border.Right.Style == CSS_LINE_STYLE_DOTTED)
buildDashedBorder(BORDER_RIGHT);
else
buildSolidBorder(BORDER_RIGHT);
} }
if (_BorderRight)
if (m_Computed.Left > 0 && m_Border.Left.Color.A > 0)
{ {
CRGBA borderColorR = RightColor; if (m_Border.Left.Style == CSS_LINE_STYLE_DASHED || m_Border.Left.Style == CSS_LINE_STYLE_DOTTED)
if (RightStyle == CSS_LINE_STYLE_OUTSET) buildDashedBorder(BORDER_LEFT);
borderColorR = blend(borderColorR, CRGBA::Black, 0.5f); else
buildSolidBorder(BORDER_LEFT);
}
if (_ModulateGlobalColor) }
borderColorR.modulateFromColor (borderColorR, globalColor);
borderColorR.A = (uint8) (((uint16) CurrentAlpha * (uint16) borderColorR.A) >> 8); // ----------------------------------------------------------------------------
rVR.drawQuad(_RenderLayer, _QuadR, rVR.getBlankTextureId(), borderColorR, false); void CSSBorderRenderer::draw() {
} if (m_Dirty) updateCoords();
if (_BorderBottom) if (m_DrawBorders.empty()) return;
{
CRGBA borderColorB = BottomColor;
if (BottomStyle == CSS_LINE_STYLE_OUTSET)
borderColorB = blend(borderColorB, CRGBA::Black, 0.5f);
if (_ModulateGlobalColor) CViewRenderer &rVR = *CViewRenderer::getInstance();
borderColorB.modulateFromColor (borderColorB, globalColor);
borderColorB.A = (uint8) (((uint16) CurrentAlpha * (uint16) borderColorB.A) >> 8); CRGBA globalColor;
rVR.drawQuad(_RenderLayer, _QuadB, rVR.getBlankTextureId(), borderColorB, false); if (m_ModulateGlobalColor)
} globalColor = CWidgetManager::getInstance()->getGlobalColor();
if (_BorderLeft)
{
CRGBA borderColorL = LeftColor;
if (LeftStyle == CSS_LINE_STYLE_INSET)
borderColorL = blend(borderColorL, CRGBA::Black, 0.5f);
if (_ModulateGlobalColor) sint32 texId = rVR.getBlankTextureId();
borderColorL.modulateFromColor (borderColorL, globalColor); for(uint i = 0; i < m_DrawBorders.size(); ++i)
{
CRGBA color = m_DrawBorders[i].Color;
if (m_ModulateGlobalColor)
color.modulateFromColor (color, globalColor);
borderColorL.A = (uint8) (((uint16) CurrentAlpha * (uint16) borderColorL.A) >> 8); color.A = (uint8) (((uint16) CurrentAlpha * (uint16) color.A) >> 8);
rVR.drawQuad(_RenderLayer, _QuadL, rVR.getBlankTextureId(), borderColorL, false); rVR.drawQuad(m_RenderLayer, m_DrawBorders[i].Quad, texId, color, false);
} }
} }

@ -0,0 +1,225 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2021 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include <string>
#include "nel/gui/css_length.h"
using namespace NLMISC;
#ifdef DEBUG_NEW
#define new DEBUG_NEW
#endif
namespace NLGUI
{
bool CSSLength::parseValue(const std::string &value, bool allowPercent, bool allowNegative)
{
static const std::set<std::string> knownUnits = {
"%", "rem", "em", "px", "pt", "vw", "vh", "vi", "vb", "vmin", "vmax"
};
std::string::size_type pos = 0;
std::string::size_type len = value.size();
if (len == 0)
return false;
if (len == 1 && value[0] == '0')
{
m_Value = 0;
m_Kind = Auto;
return true;
}
// +100px; -100px
if (value[0] == '+')
pos++;
else if (allowNegative && value[0] == '-')
pos++;
while(pos < len)
{
bool isNumeric = (value[pos] >= '0' && value[pos] <= '9')
|| (pos == 0 && value[pos] == '.')
|| (pos > 0 && value[pos] == '.' && value[pos-1] >= '0' && value[pos-1] <= '9');
if (!isNumeric)
break;
pos++;
}
std::string unit = toLowerAscii(value.substr(pos));
if (knownUnits.count(unit))
{
std::string tmpstr = value.substr(0, pos);
return fromString(tmpstr, m_Value);
}
return false;
}
float CSSLength::getValue() const
{
if (m_Unit == CSS_UNIT_PERCENT)
return m_Value / 100.f;
return m_Value;
}
void CSSLength::setFloatValue(float f, const std::string &unit)
{
m_Value = f;
setUnit(unit);
}
void CSSLength::setUnit(const std::string &unit)
{
if (unit.empty())
{
m_Unit = CSS_UNIT_NONE;
m_Kind = Fixed;
}
else if (unit == "px")
{
m_Unit = CSS_UNIT_PX;
m_Kind = Fixed;
} else if (unit == "pt")
{
m_Unit = CSS_UNIT_PT;
m_Kind = Fixed;
} else if (unit == "%")
{
m_Unit = CSS_UNIT_PERCENT;
m_Kind = Relative;
} else if (unit == "em")
{
m_Unit = CSS_UNIT_EM;
m_Kind = Relative;
} else if (unit == "rem")
{
m_Unit = CSS_UNIT_REM;
m_Kind = Relative;
} else if (unit == "vw")
{
m_Unit = CSS_UNIT_VW;
m_Kind = Relative;
} else if (unit == "vh")
{
m_Unit = CSS_UNIT_VH;
m_Kind = Relative;
} else if (unit == "vi")
{
m_Unit = CSS_UNIT_VI;
m_Kind = Relative;
} else if (unit == "vb")
{
m_Unit = CSS_UNIT_VB;
m_Kind = Relative;
} else if (unit == "vmin")
{
m_Unit = CSS_UNIT_VMIN;
m_Kind = Relative;
} else if (unit == "vmax")
{
m_Unit = CSS_UNIT_VMAX;
m_Kind = Relative;
} else if (unit == "auto")
{
m_Unit = CSS_UNIT_NONE;
m_Kind = Auto;
} else
{
// fallback to auto
m_Unit = CSS_UNIT_NONE;
m_Kind = Auto;
}
}
float CSSLength::calculate(uint32 relValue, uint32 emSize, uint32 remSize, uint32 vwSize, uint32 vhSize = 0) const
{
if (m_Kind == Auto)
return 0;
float value = getValue();
switch(m_Unit)
{
case CSS_UNIT_EM:
return emSize * value;
case CSS_UNIT_REM:
return remSize * value;
case CSS_UNIT_PERCENT:
return relValue * value;
case CSS_UNIT_PX:
case CSS_UNIT_PT:
return value;
case CSS_UNIT_VW:
case CSS_UNIT_VI:
// Vi for horizontal writing mode only
return (float)vwSize*0.01f;
case CSS_UNIT_VH:
case CSS_UNIT_VB:
// Vb for horizontal writing mode only
return (float)vhSize*0.01f;
case CSS_UNIT_VMIN:
return (float)std::min(vwSize, vhSize)*0.01f;
case CSS_UNIT_VMAX:
return (float)std::max(vwSize, vhSize)*0.01f;
}
nldebug("Unknown CSS unit '%s'", toString().c_str());
return value;
}
std::string CSSLength::toString() const
{
if (m_Kind == Auto)
return "auto";
std::string ret;
ret += NLMISC::toString("%f", m_Value);
size_t pos = ret.find(".");
for( ; pos < ret.size(); ++pos)
{
if (ret[pos] != '0')
break;
}
if (pos == ret.size())
ret = ret.substr(0, ret.find("."));
switch(m_Unit)
{
case CSS_UNIT_NONE: break;
case CSS_UNIT_EM: ret += "em"; break;
case CSS_UNIT_REM: ret += "rem"; break;
case CSS_UNIT_PERCENT: ret += "%"; break;
case CSS_UNIT_PX: ret += "px"; break;
case CSS_UNIT_PT: ret += "pt"; break;
case CSS_UNIT_VW: ret += "vw"; break;
case CSS_UNIT_VH: ret += "vh"; break;
case CSS_UNIT_VI: ret += "vi"; break;
case CSS_UNIT_VB: ret += "vb"; break;
case CSS_UNIT_VMIN: ret += "vmin"; break;
case CSS_UNIT_VMAX: ret += "vmax"; break;
}
return ret;
}
} // namespace

@ -41,25 +41,57 @@ namespace NLGUI
TStyleVec CCssParser::parseDecls(const std::string &styleString) TStyleVec CCssParser::parseDecls(const std::string &styleString)
{ {
TStyleVec styles; TStyleVec styles;
std::vector<std::string> elements; size_t pos = 0;
NLMISC::splitString(styleString, ";", elements); size_t end = styleString.size();
while(pos < end)
for(uint i = 0; i < elements.size(); ++i)
{ {
std::string::size_type pos; size_t sep = styleString.find(':', pos);
pos = elements[i].find_first_of(':'); if (sep == std::string::npos)
if (pos != std::string::npos) break;
size_t keyIndex = pos;
size_t keyLength = sep - pos;
sep++;
pos = sep;
while(sep < end)
{ {
// css properties are case-insensitive, but sep = styleString.find_first_of(";'\"(", sep);
// custom properties (--name; ...;) are case sensitive if (sep == std::string::npos || styleString[sep] == ';')
std::string key = trim(elements[i].substr(0, pos)); break;
if (key.size() < 2 || (key[0] != '-' && key[1] != '-'))
key = toLowerAscii(key); if (styleString[sep] == '\'' || styleString[sep] == '"')
std::string value = trim(elements[i].substr(pos+1)); {
styles.push_back(TStylePair(key, value)); char ch = styleString[sep];
// skip open quote
sep++;
while(sep < end && styleString[sep] != ch)
{
if (styleString[sep] == '\\')
sep++;
sep++;
}
// skip close quote
sep++;
}
else if (styleString[sep] == '(')
{
while(sep < end && styleString[sep] != ')')
{
sep++;
}
// skip close parenthesis
sep++;
}
} }
}
styles.push_back(TStylePair(trim(styleString.substr(keyIndex, keyLength)), trim(styleString.substr(pos, sep - pos))));
if (sep >= end)
break;
pos = sep + 1;
}
return styles; return styles;
} }

@ -504,7 +504,7 @@ namespace NLGUI
} }
} }
void CCssStyle::applyBorderWidth(const std::string &value, uint32 *dest, const uint32 currentWidth, const uint32 fontSize) const void CCssStyle::applyBorderWidth(const std::string &value, CSSLength *dest, const CSSLength &currentWidth) const
{ {
if (!dest) return; if (!dest) return;
if (value == "inherit") if (value == "inherit")
@ -513,37 +513,19 @@ namespace NLGUI
} }
else if (value == "thin") else if (value == "thin")
{ {
*dest = 1; dest->setFloatValue(1, "px");
} }
else if (value == "medium") else if (value == "medium")
{ {
*dest = 3; dest->setFloatValue(3, "px");
} }
else if (value == "thick") else if (value == "thick")
{ {
*dest = 5; dest->setFloatValue(5, "px");
}
else if (value == "0")
{
*dest = 0;
} }
else else
{ {
float tmpf; dest->parseValue(value, false, false);
std::string unit;
if (getCssLength(tmpf, unit, value.c_str()))
{
if (unit == "rem")
*dest = fontSize * tmpf;
else if (unit == "em")
*dest = fontSize * tmpf;
else if (unit == "pt")
*dest = tmpf / 0.75f;
else if (unit == "%")
*dest = 0; // no support for % in border width
else
*dest = tmpf;
}
} }
} }
@ -571,12 +553,22 @@ namespace NLGUI
*dest = CSS_LINE_STYLE_NONE; *dest = CSS_LINE_STYLE_NONE;
else if (value == "hidden") else if (value == "hidden")
*dest = CSS_LINE_STYLE_HIDDEN; *dest = CSS_LINE_STYLE_HIDDEN;
else if (value == "dotted")
*dest = CSS_LINE_STYLE_DOTTED;
else if (value == "dashed")
*dest = CSS_LINE_STYLE_DASHED;
else if (value == "solid")
*dest = CSS_LINE_STYLE_SOLID;
else if (value == "double")
*dest = CSS_LINE_STYLE_DOUBLE;
else if (value == "groove")
*dest = CSS_LINE_STYLE_GROOVE;
else if (value == "ridge")
*dest = CSS_LINE_STYLE_RIDGE;
else if (value == "inset") else if (value == "inset")
*dest = CSS_LINE_STYLE_INSET; *dest = CSS_LINE_STYLE_INSET;
else if (value == "outset") else if (value == "outset")
*dest = CSS_LINE_STYLE_OUTSET; *dest = CSS_LINE_STYLE_OUTSET;
else if (value == "solid")
*dest = CSS_LINE_STYLE_SOLID;
} }
void CCssStyle::applyPaddingWidth(const std::string &value, uint32 *dest, const uint32 currentPadding, uint32 fontSize) const void CCssStyle::applyPaddingWidth(const std::string &value, uint32 *dest, const uint32 currentPadding, uint32 fontSize) const
@ -606,6 +598,39 @@ namespace NLGUI
} }
} }
void CCssStyle::applyMarginWidth(const std::string &value, uint32 *dest, const uint32 current, uint32 fontSize) const
{
if (!dest) return;
if (value == "inherit")
{
*dest = current;
return;
}
else if (value == "auto")
{
// TODO: requires content width;
*dest = 0;
return;
}
float tmpf;
std::string unit;
if (getCssLength(tmpf, unit, value.c_str()))
{
if (unit == "rem")
*dest = fontSize * tmpf;
else if (unit == "em")
*dest = fontSize * tmpf;
else if (unit == "pt")
*dest = tmpf / 0.75f;
else if (unit == "%")
*dest = 0; // TODO: requires content width, must remember 'unit' type
else
*dest = tmpf;
}
}
// apply style rules // apply style rules
void CCssStyle::apply(CStyleParams &style, const CStyleParams &current) const void CCssStyle::apply(CStyleParams &style, const CStyleParams &current) const
{ {
@ -613,18 +638,22 @@ namespace NLGUI
TStyle::const_iterator it; TStyle::const_iterator it;
for (it=style.StyleRules.begin(); it != style.StyleRules.end(); ++it) for (it=style.StyleRules.begin(); it != style.StyleRules.end(); ++it)
{ {
if (it->first == "border-top-width") applyBorderWidth(it->second, &style.BorderTopWidth, current.BorderTopWidth, current.FontSize); if (it->first == "border-top-width") applyBorderWidth(it->second, &style.Border.Top.Width, current.Border.Top.Width);
else if (it->first == "border-top-color") applyBorderColor(it->second, &style.BorderTopColor, current.BorderTopColor, current.TextColor); else if (it->first == "border-top-color") applyBorderColor(it->second, &style.Border.Top.Color, current.Border.Top.Color, current.TextColor);
else if (it->first == "border-top-style") applyLineStyle(it->second, &style.BorderTopStyle, current.BorderTopStyle); else if (it->first == "border-top-style") applyLineStyle(it->second, &style.Border.Top.Style, current.Border.Top.Style);
else if (it->first == "border-right-width") applyBorderWidth(it->second, &style.BorderRightWidth, current.BorderRightWidth, current.FontSize); else if (it->first == "border-right-width") applyBorderWidth(it->second, &style.Border.Right.Width, current.Border.Right.Width);
else if (it->first == "border-right-color") applyBorderColor(it->second, &style.BorderRightColor, current.BorderRightColor, current.TextColor); else if (it->first == "border-right-color") applyBorderColor(it->second, &style.Border.Right.Color, current.Border.Right.Color, current.TextColor);
else if (it->first == "border-right-style") applyLineStyle(it->second, &style.BorderRightStyle, current.BorderRightStyle); else if (it->first == "border-right-style") applyLineStyle(it->second, &style.Border.Right.Style, current.Border.Right.Style);
else if (it->first == "border-bottom-width") applyBorderWidth(it->second, &style.BorderBottomWidth, current.BorderBottomWidth, current.FontSize); else if (it->first == "border-bottom-width") applyBorderWidth(it->second, &style.Border.Bottom.Width, current.Border.Bottom.Width);
else if (it->first == "border-bottom-color") applyBorderColor(it->second, &style.BorderBottomColor, current.BorderBottomColor, current.TextColor); else if (it->first == "border-bottom-color") applyBorderColor(it->second, &style.Border.Bottom.Color, current.Border.Bottom.Color, current.TextColor);
else if (it->first == "border-bottom-style") applyLineStyle(it->second, &style.BorderBottomStyle, current.BorderBottomStyle); else if (it->first == "border-bottom-style") applyLineStyle(it->second, &style.Border.Bottom.Style, current.Border.Bottom.Style);
else if (it->first == "border-left-width") applyBorderWidth(it->second, &style.BorderLeftWidth, current.BorderLeftWidth, current.FontSize); else if (it->first == "border-left-width") applyBorderWidth(it->second, &style.Border.Left.Width, current.Border.Left.Width);
else if (it->first == "border-left-color") applyBorderColor(it->second, &style.BorderLeftColor, current.BorderLeftColor, current.TextColor); else if (it->first == "border-left-color") applyBorderColor(it->second, &style.Border.Left.Color, current.Border.Left.Color, current.TextColor);
else if (it->first == "border-left-style") applyLineStyle(it->second, &style.BorderLeftStyle, current.BorderLeftStyle); else if (it->first == "border-left-style") applyLineStyle(it->second, &style.Border.Left.Style, current.Border.Left.Style);
else if (it->first == "margin-top") applyMarginWidth(it->second, &style.MarginTop, current.MarginTop, current.FontSize);
else if (it->first == "margin-right") applyMarginWidth(it->second, &style.MarginRight, current.MarginRight, current.FontSize);
else if (it->first == "margin-bottom") applyMarginWidth(it->second, &style.MarginBottom, current.MarginBottom, current.FontSize);
else if (it->first == "margin-left") applyMarginWidth(it->second, &style.MarginLeft, current.MarginLeft, current.FontSize);
else if (it->first == "padding-top") applyPaddingWidth(it->second, &style.PaddingTop, current.PaddingTop, current.FontSize); else if (it->first == "padding-top") applyPaddingWidth(it->second, &style.PaddingTop, current.PaddingTop, current.FontSize);
else if (it->first == "padding-right") applyPaddingWidth(it->second, &style.PaddingRight, current.PaddingRight, current.FontSize); else if (it->first == "padding-right") applyPaddingWidth(it->second, &style.PaddingRight, current.PaddingRight, current.FontSize);
else if (it->first == "padding-bottom") applyPaddingWidth(it->second, &style.PaddingBottom, current.PaddingBottom, current.FontSize); else if (it->first == "padding-bottom") applyPaddingWidth(it->second, &style.PaddingBottom, current.PaddingBottom, current.FontSize);
@ -907,16 +936,26 @@ namespace NLGUI
style.GlobalColor = b; style.GlobalColor = b;
} }
else else
if (it->first == "-ryzom-modulate-text-color")
{
bool b;
if (it->second == "inherit")
style.GlobalColorText = current.GlobalColorText;
else
if (fromString(it->second, b))
style.GlobalColorText = b;
}
else
if (it->first == "background-color") if (it->first == "background-color")
{ {
if (it->second == "inherit") if (it->second == "inherit")
style.BackgroundColor = current.BackgroundColor; style.Background.color = current.Background.color;
else if (it->second == "transparent") else if (it->second == "transparent")
style.BackgroundColor = CRGBA(0, 0, 0, 0); style.Background.color = CRGBA(0, 0, 0, 0);
else if (it->second == "currentcolor") else if (it->second == "currentcolor")
style.BackgroundColorOver = style.TextColor; style.Background.color = style.TextColor;
else else
scanHTMLColor(it->second.c_str(), style.BackgroundColor); scanHTMLColor(it->second.c_str(), style.Background.color);
} }
else else
if (it->first == "-ryzom-background-color-over") if (it->first == "-ryzom-background-color-over")
@ -940,10 +979,13 @@ namespace NLGUI
image = image.substr(4, image.size()-5); image = image.substr(4, image.size()-5);
} }
style.StyleRules[it->first] = trimQuotes(image); style.StyleRules[it->first] = trimQuotes(image);
style.Background.setImage(style.StyleRules[it->first]);
} }
else else
if (it->first == "background-repeat") if (it->first == "background-repeat")
{ {
style.Background.setRepeat(it->second);
// TODO: remove after removing old code that depends on this
// normalize // normalize
std::string val = toLowerAscii(trim(it->second)); std::string val = toLowerAscii(trim(it->second));
std::vector<std::string> parts; std::vector<std::string> parts;
@ -957,6 +999,8 @@ namespace NLGUI
else else
if (it->first == "background-size") if (it->first == "background-size")
{ {
style.Background.setSize(it->second);
// TODO: remove after removing old code that depends on this
// normalize // normalize
std::string val = toLowerAscii(trim(it->second)); std::string val = toLowerAscii(trim(it->second));
std::vector<std::string> parts; std::vector<std::string> parts;
@ -966,6 +1010,27 @@ namespace NLGUI
style.StyleRules[it->first] = val; style.StyleRules[it->first] = val;
} }
else
if (it->first == "background-position")
{
// TODO: background-position-x, background-position-y
style.Background.setPosition(it->second);
}
else
if (it->first == "background-origin")
{
style.Background.setOrigin(it->second);
}
else
if (it->first == "background-clip")
{
style.Background.setClip(it->second);
}
else
if (it->first == "background-attachment")
{
style.Background.setAttachment(it->second);
}
} }
// if outer element has underline set, then inner element cannot remove it // if outer element has underline set, then inner element cannot remove it
@ -1039,7 +1104,18 @@ namespace NLGUI
// second loop -> false && break // second loop -> false && break
loop = !loop; loop = !loop;
if (next < parts.size()) if (next >= parts.size())
break;
val = toLower(parts[next]);
if (val == "center")
{
if (bgPositionX.empty()) bgPositionX = "center";
if (bgPositionY.empty()) bgPositionY = "center";
// consume 'center'
next++;
}
else if (val == "left" || val == "right")
{ {
val = toLowerAscii(parts[next]); val = toLowerAscii(parts[next]);
if (val == "center") if (val == "center")
@ -1049,30 +1125,57 @@ namespace NLGUI
// consume 'center' // consume 'center'
next++; next++;
} }
else if (val == "left" || val == "right") else if ((bgPositionX.empty() || bgPositionX == "center") && (val == "left" || val == "right"))
{ {
bgPositionX = val; bgPositionX = val;
// consume 'left|right' // consume 'left|right'
next++; next++;
if (next < parts.size() && getCssLength(fval, unit, parts[next])) if (next < parts.size() && getCssLength(fval, unit, parts[next]))
{ {
bgPositionX += " " + toString("%.0f%s", fval, unit.c_str()); bgPositionX += " " + parts[next];
// consume css length // consume css length
next++; next++;
} }
} }
else if (val == "top" || val == "bottom") else if ((bgPositionY.empty() || bgPositionY == "center") && (val == "top" || val == "bottom"))
{ {
bgPositionY = val; bgPositionY = val;
// consume top|bottom // consume top|bottom
next++; next++;
if (next < parts.size() && getCssLength(fval, unit, parts[next])) if (next < parts.size() && getCssLength(fval, unit, parts[next]))
{ {
bgPositionY += " " + toString("%.0f%s", fval, unit.c_str()); bgPositionY += " " + parts[next];
// consume css length // consume css length
next++; next++;
} }
} }
else if (getCssLength(fval, unit, parts[next]))
{
// override X only on first loop
if (next == index)
{
bgPositionX = parts[next];
}
else if (bgPositionY.empty())
{
bgPositionY = parts[next];
}
else
{
// invalid
bgPositionX.clear();
bgPositionY.clear();
break;
}
next++;
}
else
{
// invalid value
bgPositionX.clear();
bgPositionY.clear();
break;
}
} }
} while (loop); } while (loop);
@ -1115,7 +1218,7 @@ namespace NLGUI
if (val == "auto") if (val == "auto")
h = v = "auto"; h = v = "auto";
else else
h = v = toString("%.0f%s", fval, unit.c_str()); h = v = val;
next++; next++;
if (next < parts.size()) if (next < parts.size())
@ -1124,7 +1227,7 @@ namespace NLGUI
if (val == "auto") if (val == "auto")
v = "auto"; v = "auto";
else if (getCssLength(fval, unit, val)) else if (getCssLength(fval, unit, val))
v = toString("%.0f%s", fval, unit.c_str()); v = val;
else else
next--; // not size token next--; // not size token
} }
@ -1207,7 +1310,10 @@ namespace NLGUI
// first time background-origin is set, also set background-clip // first time background-origin is set, also set background-clip
if (!bgClipFound) if (!bgClipFound)
{
bgClipValue = val; bgClipValue = val;
bgClipFound = true;
}
} }
} }
else if (props[i] == "background-clip") else if (props[i] == "background-clip")
@ -1257,6 +1363,7 @@ namespace NLGUI
{ {
if (props[i] == "background-position") if (props[i] == "background-position")
{ {
style["background-position"] = bgPositionX + " " + bgPositionY;
style["background-position-x"] = bgPositionX; style["background-position-x"] = bgPositionX;
style["background-position-y"] = bgPositionY; style["background-position-y"] = bgPositionY;
} }
@ -1271,10 +1378,10 @@ namespace NLGUI
} }
else else
{ {
// fill in default if one is set // fill in default if one is not set
if (props[i] == "background-image") if (props[i] == "background-image")
{ {
style[props[i]] = "none"; style[props[i]] = "";
} }
else if (props[i] == "background-position") else if (props[i] == "background-position")
{ {
@ -1556,6 +1663,22 @@ namespace NLGUI
style["padding-left"] = parts[l]; style["padding-left"] = parts[l];
} }
// ***************************************************************************
void CCssStyle::expandMarginShorthand(const std::string &value, TStyle &style) const
{
std::vector<std::string> parts;
splitParams(toLowerAscii(value), ' ', parts);
uint8 t, r, b, l;
if (!getShorthandIndices(parts.size(), t, r, b, l))
return;
style["margin-top"] = parts[t];
style["margin-right"] = parts[r];
style["margin-bottom"] = parts[b];
style["margin-left"] = parts[l];
}
// *************************************************************************** // ***************************************************************************
void CCssStyle::expandShorthand(const std::string &prop, const std::string &value, TStyle &style) const void CCssStyle::expandShorthand(const std::string &prop, const std::string &value, TStyle &style) const
{ {

@ -872,6 +872,7 @@ namespace NLGUI
if (CCtrlBase::handleEvent(event)) return true; if (CCtrlBase::handleEvent(event)) return true;
if (!_Active || _Frozen) if (!_Active || _Frozen)
return false; return false;
if (event.getType() == NLGUI::CEventDescriptor::mouse) if (event.getType() == NLGUI::CEventDescriptor::mouse)
{ {
const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event; const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
@ -1255,6 +1256,7 @@ namespace NLGUI
if(wReal <= maxWReal) if(wReal <= maxWReal)
return; return;
// compute the new ofsX. // compute the new ofsX.
sint32 ofsX= _Target->getOfsX(); sint32 ofsX= _Target->getOfsX();
ofsX+= dx; ofsX+= dx;

@ -1105,6 +1105,69 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CCtrlTextButton::setTextureLua(const std::string &name)
{
_TextureIdNormal[0].setTexture(std::string(name + "_l.tga").c_str());
_TextureIdNormal[1].setTexture(std::string(name + "_m.tga").c_str());
_TextureIdNormal[2].setTexture(std::string(name + "_r.tga").c_str());
}
// ***************************************************************************
void CCtrlTextButton::setTexturePushedLua(const std::string &name)
{
_TextureIdPushed[0].setTexture(std::string(name + "_l.tga").c_str());
_TextureIdPushed[1].setTexture(std::string(name + "_m.tga").c_str());
_TextureIdPushed[2].setTexture(std::string(name + "_r.tga").c_str());
}
// ***************************************************************************
void CCtrlTextButton::setTextureOverLua(const std::string &name)
{
_TextureIdOver[0].setTexture(std::string(name + "_l.tga").c_str());
_TextureIdOver[1].setTexture(std::string(name + "_m.tga").c_str());
_TextureIdOver[2].setTexture(std::string(name + "_r.tga").c_str());
}
// ***************************************************************************
std::string CCtrlTextButton::getTexture() const
{
std::string tx = CViewRenderer::getInstance()->getTextureNameFromId(_TextureIdNormal[0]);
std::string::size_type i = tx.rfind("_l.tga");
if (i != std::string::npos)
tx = tx.substr(0, i);
return tx;
}
// ***************************************************************************
std::string CCtrlTextButton::getTexturePushed() const
{
std::string tx = CViewRenderer::getInstance()->getTextureNameFromId(_TextureIdOver[0]);
std::string::size_type i = tx.rfind("_l.tga");
if (i != std::string::npos)
tx = tx.substr(0, i);
return tx;
}
// ***************************************************************************
std::string CCtrlTextButton::getTextureOver() const
{
std::string tx = CViewRenderer::getInstance()->getTextureNameFromId(_TextureIdPushed[0]);
std::string::size_type i = tx.rfind("_l.tga");
if (i != std::string::npos)
tx = tx.substr(0, i);
return tx;
}
// ***************************************************************************
int CCtrlTextButton::luaGetViewText(CLuaState &ls) int CCtrlTextButton::luaGetViewText(CLuaState &ls)
{ {
const char *funcName = "getViewText"; const char *funcName = "getViewText";

File diff suppressed because it is too large Load Diff

@ -1,5 +1,5 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2019 Winch Gate Property Limited // Copyright (C) 2010-2020 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
@ -380,6 +380,23 @@ namespace NLGUI
if (pUG) if (pUG)
setUserGroupRight((uint)_Lines.size()-1, pUG, true); setUserGroupRight((uint)_Lines.size()-1, pUG, true);
} }
// usergroup from simple icon
CXMLAutoPtr icon((const char*) xmlGetProp (cur, (xmlChar*)"icon"));
if (icon)
{
typedef std::pair<std::string, std::string> TTmplParams;
std::vector<TTmplParams> vparams;
uint lineIndex = _Lines.size()-1;
vparams.push_back(TTmplParams("id", toString("icon%d", lineIndex)));
vparams.push_back(TTmplParams("sizeref", ""));
vparams.push_back(TTmplParams("icon_texture", (const char*)icon));
//vparams.push_back(TTmplParams("icon_color", options.ColorNormal.toString()));
string lineId = toString("%s:icon", pV->getId().c_str());
CInterfaceGroup *pUG = CWidgetManager::getInstance()->getParser()->createGroupInstance("menu_row_icon", lineId, vparams);
if (pUG)
setUserGroupLeft((uint)_Lines.size()-1, pUG, true);
}
} }
cur = cur->next; cur = cur->next;
} }
@ -572,8 +589,6 @@ namespace NLGUI
CGroupFrame::updateCoords(); CGroupFrame::updateCoords();
bool mustUpdate = false;
if (_MaxVisibleLine > 0 && sint32(_Lines.size())>_MaxVisibleLine) if (_MaxVisibleLine > 0 && sint32(_Lines.size())>_MaxVisibleLine)
{ {
for(k = 0; k < _Lines.size(); ++k) for(k = 0; k < _Lines.size(); ++k)
@ -604,7 +619,6 @@ namespace NLGUI
_SelectionView->setW (-8-8-2); _SelectionView->setW (-8-8-2);
_ScrollBar->setSerializable( false ); _ScrollBar->setSerializable( false );
addCtrl(_ScrollBar); addCtrl(_ScrollBar);
mustUpdate = true;
} }
break; break;
} }
@ -653,13 +667,7 @@ namespace NLGUI
} }
} }
CGroupFrame::updateCoords();
if (mustUpdate)
{
CGroupFrame::updateCoords();
}
// *** Setup SubMenus and CheckBoxes Positions // *** Setup SubMenus and CheckBoxes Positions
sint32 maxViewW = 0; sint32 maxViewW = 0;

@ -29,6 +29,7 @@
#include "nel/misc/i18n.h" #include "nel/misc/i18n.h"
#include "nel/misc/xml_auto_ptr.h" #include "nel/misc/xml_auto_ptr.h"
#include "nel/gui/css_border_renderer.h" #include "nel/gui/css_border_renderer.h"
#include "nel/gui/css_background_renderer.h"
using namespace std; using namespace std;
using namespace NLMISC; using namespace NLMISC;
@ -44,9 +45,7 @@ namespace NLGUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
CGroupCell::CGroupCell(const TCtorParam &param) CGroupCell::CGroupCell(const TCtorParam &param)
: CInterfaceGroup(param), : CInterfaceGroup(param)
BgColor (0,0,0,0)
{ {
NewLine = false; NewLine = false;
TableRatio = 0.f; TableRatio = 0.f;
@ -58,6 +57,7 @@ namespace NLGUI
Group = new CInterfaceGroup(CViewBase::TCtorParam()); Group = new CInterfaceGroup(CViewBase::TCtorParam());
// TODO: only initialize if border is set // TODO: only initialize if border is set
Border = new CSSBorderRenderer(); Border = new CSSBorderRenderer();
Background = new CSSBackgroundRenderer();
PaddingTop = PaddingRight = PaddingBottom = PaddingLeft = 0; PaddingTop = PaddingRight = PaddingBottom = PaddingLeft = 0;
Align = Left; Align = Left;
VAlign = Middle; VAlign = Middle;
@ -66,12 +66,6 @@ namespace NLGUI
IgnoreMaxWidth = false; IgnoreMaxWidth = false;
IgnoreMinWidth = false; IgnoreMinWidth = false;
AddChildW = false; AddChildW = false;
_TextureTiled = false;
_TextureScaled = false;
_TextureXReal = 0;
_TextureYReal = 0;
_TextureWReal = 0;
_TextureHReal = 0;
setEnclosedGroupDefaultParams(); setEnclosedGroupDefaultParams();
addGroup (Group); addGroup (Group);
} }
@ -84,6 +78,11 @@ namespace NLGUI
delete Border; delete Border;
Border = NULL; Border = NULL;
} }
if (Background)
{
delete Background;
Background = NULL;
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -151,7 +150,9 @@ namespace NLGUI
else else
if( name == "bgcolor" ) if( name == "bgcolor" )
{ {
return toString( BgColor ); if (Background)
return toString( Background->getColor() );
return toString(CRGBA::Transparent);
} }
else else
if( name == "width" ) if( name == "width" )
@ -233,9 +234,12 @@ namespace NLGUI
else else
if( name == "bgcolor" ) if( name == "bgcolor" )
{ {
if (!Background)
Background = new CSSBackgroundRenderer();
CRGBA c; CRGBA c;
if( fromString( value, c ) ) if( fromString( value, c ) )
BgColor = c; Background->setColor(c);
return; return;
} }
else else
@ -342,7 +346,8 @@ namespace NLGUI
xmlSetProp( node, BAD_CAST "valign", BAD_CAST "" ); xmlSetProp( node, BAD_CAST "valign", BAD_CAST "" );
xmlSetProp( node, BAD_CAST "left_margin", BAD_CAST toString( LeftMargin ).c_str() ); xmlSetProp( node, BAD_CAST "left_margin", BAD_CAST toString( LeftMargin ).c_str() );
xmlSetProp( node, BAD_CAST "nowrap", BAD_CAST toString( NoWrap ).c_str() ); xmlSetProp( node, BAD_CAST "nowrap", BAD_CAST toString( NoWrap ).c_str() );
xmlSetProp( node, BAD_CAST "bgcolor", BAD_CAST toString( BgColor ).c_str() ); if (Background)
xmlSetProp( node, BAD_CAST "bgcolor", BAD_CAST toString( Background->getColor() ).c_str() );
if( WidthWanted != 0 ) if( WidthWanted != 0 )
xmlSetProp( node, BAD_CAST "width", BAD_CAST toString( WidthWanted ).c_str() ); xmlSetProp( node, BAD_CAST "width", BAD_CAST toString( WidthWanted ).c_str() );
@ -435,7 +440,9 @@ namespace NLGUI
ptr = (char*) xmlGetProp( cur, (xmlChar*)"bgcolor" ); ptr = (char*) xmlGetProp( cur, (xmlChar*)"bgcolor" );
if (ptr) if (ptr)
{ {
BgColor = convertColor(ptr); if (!Background)
Background = new CSSBackgroundRenderer();
Background->setColor(convertColor(ptr));
} }
// //
ptr = (char*) xmlGetProp( cur, (xmlChar*)"width" ); ptr = (char*) xmlGetProp( cur, (xmlChar*)"width" );
@ -501,72 +508,39 @@ namespace NLGUI
rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_WReal-1, _YReal, 1, _HReal, 0, false, rVR.getBlankTextureId(), CRGBA(0,255,255,255) ); rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_WReal-1, _YReal, 1, _HReal, 0, false, rVR.getBlankTextureId(), CRGBA(0,255,255,255) );
} }
uint8 CurrentAlpha = 255;
CGroupTable *table = NULL;
if (getParent ())
{
table = static_cast<CGroupTable*> (getParent ());
CurrentAlpha = table->CurrentAlpha;
}
// Draw the background
if (BgColor.A > 0 || !_TextureId.empty())
{ {
CViewRenderer &rVR = *CViewRenderer::getInstance(); CViewRenderer &rVR = *CViewRenderer::getInstance();
// flush draw queue to force correct draw order
rVR.flush();
bool flush = false; if (Background)
if (CurrentAlpha > 0 && !_TextureId.empty())
{ {
CRGBA col = CRGBA::White; uint8 CurrentAlpha = 255;
col.A = CurrentAlpha; CGroupTable *table = NULL;
if (getParent ())
sint32 oldSciX, oldSciY, oldSciW, oldSciH;
makeNewClip (oldSciX, oldSciY, oldSciW, oldSciH);
if (_TextureScaled && !_TextureTiled)
{ {
rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _HReal, 0, false, _TextureId, col); table = static_cast<CGroupTable*> (getParent ());
CurrentAlpha = table->CurrentAlpha;
} }
else if (CurrentAlpha > 0)
{ {
if (!_TextureTiled) Background->CurrentAlpha = CurrentAlpha;
rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _TextureWReal, _TextureHReal, 0, false, _TextureId, col); Background->setModulateGlobalColor(_ModulateGlobalColor);
else Background->draw();
rVR.drawRotFlipBitmapTiled(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _TextureHReal, 0, false, _TextureId, 0, col); rVR.flush();
} }
restoreClip (oldSciX, oldSciY, oldSciW, oldSciH);
flush = true;
}
if (BgColor.A > 0)
{
CRGBA finalColor = BgColor;
if (_ModulateGlobalColor)
finalColor.modulateFromColor (finalColor, CWidgetManager::getInstance()->getGlobalColor());
finalColor.A = (uint8) (((uint16) CurrentAlpha * (uint16) finalColor.A) >> 8);
if (finalColor.A > 0)
rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), finalColor);
flush = true;
} }
if (flush) if (Border)
rVR.flush();
}
if (Border)
{
// TODO: monitor these in checkCoords and update when changed
uint8 contentAlpha = CWidgetManager::getInstance()->getGlobalColorForContent().A;
if (contentAlpha > 0)
{ {
Border->CurrentAlpha = contentAlpha; Border->CurrentAlpha = CWidgetManager::getInstance()->getGlobalColorForContent().A;
Border->setRenderLayer(_RenderLayer); if (Border->CurrentAlpha > 0)
Border->setModulateGlobalColor(_ModulateGlobalColor); {
Border->draw(); Border->setRenderLayer(_RenderLayer);
Border->setModulateGlobalColor(_ModulateGlobalColor);
Border->draw();
rVR.flush();
}
} }
} }
@ -595,62 +569,35 @@ namespace NLGUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupCell::setTexture(const std::string & TxName) void CGroupCell::setTexture(const std::string & TxName)
{ {
if (TxName.empty() || TxName == "none") if (Background)
{ Background->setImage(TxName);
_TextureId.clear();
}
else
{
_TextureId.setTexture (TxName.c_str (), 0, 0, -1, -1, false);
updateTextureCoords();
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupCell::setTextureTile(bool tiled) void CGroupCell::setTextureTile(bool tiled)
{ {
_TextureTiled = tiled; if (Background)
Background->setImageRepeat(tiled);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupCell::setTextureScale(bool scaled) void CGroupCell::setTextureScale(bool scaled)
{ {
_TextureScaled = scaled; if (Background)
} Background->setImageCover(scaled);
// ----------------------------------------------------------------------------
void CGroupCell::updateTextureCoords()
{
if (_TextureId.empty()) return;
CViewRenderer &rVR = *CViewRenderer::getInstance();
rVR.getTextureSizeFromId (_TextureId, _TextureWReal, _TextureHReal);
_TextureXReal = _XReal;
_TextureYReal = _YReal + _HReal - _TextureHReal;
if (_TextureTiled && _TextureHReal > 0)
{
sint diff = (_HReal / _TextureHReal) * _TextureHReal;
_TextureYReal -= diff;
_TextureHReal += diff;
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupCell::updateCoords() void CGroupCell::updateCoords()
{ {
CInterfaceGroup::updateCoords(); CInterfaceGroup::updateCoords();
updateTextureCoords();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
NLMISC_REGISTER_OBJECT(CViewBase, CGroupTable, std::string, "table"); NLMISC_REGISTER_OBJECT(CViewBase, CGroupTable, std::string, "table");
CGroupTable::CGroupTable(const TCtorParam &param) CGroupTable::CGroupTable(const TCtorParam &param)
: CInterfaceGroup(param), : CInterfaceGroup(param)
BgColor(0,0,0,255)
{ {
_ContentValidated = false; _ContentValidated = false;
TableRatio = 0.f; TableRatio = 0.f;
@ -658,18 +605,12 @@ namespace NLGUI
// TODO: only initialize when needed // TODO: only initialize when needed
Border = new CSSBorderRenderer(); Border = new CSSBorderRenderer();
Background = new CSSBackgroundRenderer();
CellBorder = false; CellBorder = false;
CellPadding=1; CellPadding=1;
CellSpacing=2; CellSpacing=2;
ContinuousUpdate = false; ContinuousUpdate = false;
_TextureTiled = false;
_TextureScaled = false;
_TextureXReal = 0;
_TextureYReal = 0;
_TextureWReal = 0;
_TextureHReal = 0;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -737,6 +678,12 @@ namespace NLGUI
Border = NULL; Border = NULL;
} }
if (Background)
{
delete Background;
Background = NULL;
}
/* uint i; /* uint i;
for (i=0; i<_Cells.size(); i++) for (i=0; i<_Cells.size(); i++)
delete _Cells[i]; delete _Cells[i];
@ -746,46 +693,22 @@ namespace NLGUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupTable::setTexture(const std::string & TxName) void CGroupTable::setTexture(const std::string & TxName)
{ {
if (TxName.empty() || TxName == "none") if (Background)
{ Background->setImage(TxName);
_TextureId.clear();
}
else
{
_TextureId.setTexture (TxName.c_str (), 0, 0, -1, -1, false);
updateTextureCoords();
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupTable::setTextureTile(bool tiled) void CGroupTable::setTextureTile(bool tiled)
{ {
_TextureTiled = tiled; if (Background)
Background->setImageRepeat(tiled);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupTable::setTextureScale(bool scaled) void CGroupTable::setTextureScale(bool scaled)
{ {
_TextureScaled = scaled; if (Background)
} Background->setImageCover(scaled);
// ----------------------------------------------------------------------------
void CGroupTable::updateTextureCoords()
{
if (_TextureId.empty()) return;
CViewRenderer &rVR = *CViewRenderer::getInstance();
rVR.getTextureSizeFromId (_TextureId, _TextureWReal, _TextureHReal);
_TextureXReal = _XReal;
_TextureYReal = _YReal + _HReal - _TextureHReal;
if (_TextureTiled && _TextureHReal > 0)
{
sint diff = (_HReal / _TextureHReal) * _TextureHReal;
_TextureYReal -= diff;
_TextureHReal += diff;
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -1299,14 +1222,35 @@ namespace NLGUI
CInterfaceGroup::updateCoords(); CInterfaceGroup::updateCoords();
updateTextureCoords();
// update borders if present // update borders if present
if (Border) if (Border)
{ {
Border->setRect(_XReal + _MarginLeft, _YReal, _WReal, _HReal); Border->setRect(_XReal + _MarginLeft, _YReal, _WReal, _HReal);
} }
if (Background)
{
sint32 l = _XReal + _MarginLeft;
sint32 b = _YReal;
sint32 w = _WReal;
sint32 h = _HReal;
Background->setBorderArea(l, b, w, h);
if (Border) {
l += Border->getLeftWidth();
b += Border->getBottomWidth();
w -= Border->getLeftRightWidth();
h -= Border->getTopBottomWidth();
}
Background->setPaddingArea(l, b, w, h);
// TODO: padding
//CSSRect<sint32> Padding;
//l += Padding.Left;
//b += Padding.Bottom;
//w -= Padding.Left - Padding.Right;
//h -= Padding.Top - Padding.Bottom;
Background->setContentArea(l, b, w, h);
}
// update cell borders if present // update cell borders if present
for (uint32 i=0; i<_Cells.size(); i++) for (uint32 i=0; i<_Cells.size(); i++)
{ {
@ -1314,6 +1258,28 @@ namespace NLGUI
{ {
_Cells[i]->Border->setRect(_Cells[i]->_XReal, _Cells[i]->_YReal, _Cells[i]->_WReal, _Cells[i]->_HReal); _Cells[i]->Border->setRect(_Cells[i]->_XReal, _Cells[i]->_YReal, _Cells[i]->_WReal, _Cells[i]->_HReal);
} }
if (_Cells[i]->Background)
{
sint32 l = _Cells[i]->_XReal;
sint32 b = _Cells[i]->_YReal;
sint32 w = _Cells[i]->_WReal;
sint32 h = _Cells[i]->_HReal;
_Cells[i]->Background->setBorderArea(l, b, w, h);
if (_Cells[i]->Border) {
l += Border->getLeftWidth();
b += Border->getBottomWidth();
w -= Border->getLeftRightWidth();
h -= Border->getTopBottomWidth();
}
_Cells[i]->Background->setPaddingArea(l, b, w, h);
// TODO: padding
//CSSRect<sint32> Padding;
//l += Padding.Left;
//b += Padding.Bottom;
//w -= Padding.Left - Padding.Right;
//h -= Padding.Top - Padding.Bottom;
_Cells[i]->Background->setContentArea(l, b, w, h);
}
} }
// Validated // Validated
@ -1502,57 +1468,24 @@ namespace NLGUI
bool flush = false; bool flush = false;
CViewRenderer &rVR = *CViewRenderer::getInstance(); CViewRenderer &rVR = *CViewRenderer::getInstance();
if (BgColor.A > 0) // TODO: monitor these in checkCoords and update when changed
{ uint8 contentAlpha = CWidgetManager::getInstance()->getGlobalColorForContent().A;
CRGBA finalColor = BgColor; if (contentAlpha > 0)
if (_ModulateGlobalColor)
finalColor.modulateFromColor (finalColor, CWidgetManager::getInstance()->getGlobalColor());
finalColor.A = (uint8) (((uint16) CurrentAlpha * (uint16) finalColor.A) >> 8);
rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), finalColor);
flush = true;
}
// Draw the background
if (CurrentAlpha > 0 && !_TextureId.empty())
{ {
sint32 oldSciX, oldSciY, oldSciW, oldSciH; if (Background)
makeNewClip (oldSciX, oldSciY, oldSciW, oldSciH);
CRGBA col = CRGBA::White;
col.A = CurrentAlpha;
if (_TextureScaled && !_TextureTiled)
{
rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _HReal, 0, false, _TextureId, col);
}
else
{ {
if (!_TextureTiled) Background->CurrentAlpha = CurrentAlpha;
rVR.drawRotFlipBitmap(_RenderLayer, _TextureXReal, _TextureYReal, _TextureWReal, _TextureHReal, 0, false, _TextureId, col); Background->setModulateGlobalColor(_ModulateGlobalColor);
else Background->draw();
rVR.drawRotFlipBitmapTiled(_RenderLayer, _TextureXReal, _TextureYReal, _WReal, _TextureHReal, 0, false, _TextureId, 0, col); rVR.flush();
} }
if (Border)
restoreClip (oldSciX, oldSciY, oldSciW, oldSciH);
flush = true;
}
// flush background color and image
if (flush)
rVR.flush();
if (Border)
{
// TODO: monitor these in checkCoords and update when changed
uint8 contentAlpha = CWidgetManager::getInstance()->getGlobalColorForContent().A;
if (contentAlpha > 0)
{ {
Border->CurrentAlpha = CurrentAlpha; Border->CurrentAlpha = CurrentAlpha;
Border->setRenderLayer(_RenderLayer); Border->setRenderLayer(_RenderLayer);
Border->setModulateGlobalColor(_ModulateGlobalColor); Border->setModulateGlobalColor(_ModulateGlobalColor);
Border->draw(); Border->draw();
rVR.flush();
} }
} }
} }
@ -1568,14 +1501,14 @@ namespace NLGUI
if( name == "border" ) if( name == "border" )
{ {
if (Border) if (Border)
return toString( Border->TopWidth ); return toString( Border->getTopWidth() );
return "0"; return "0";
} }
else else
if( name == "bordercolor" ) if( name == "bordercolor" )
{ {
if (Border) if (Border)
return toString( Border->TopColor ); return toString( Border->getTopColor() );
return toString(CRGBA::Transparent); return toString(CRGBA::Transparent);
} }
else else
@ -1591,7 +1524,9 @@ namespace NLGUI
else else
if( name == "bgcolor" ) if( name == "bgcolor" )
{ {
return toString( BgColor ); if (Background)
return toString( Background->getColor() );
return toString( CRGBA::Transparent );
} }
else else
if( name == "width" ) if( name == "width" )
@ -1614,10 +1549,7 @@ namespace NLGUI
{ {
if (!Border) if (!Border)
Border = new CSSBorderRenderer(); Border = new CSSBorderRenderer();
Border->TopWidth = i; Border->setWidth(i);
Border->RightWidth = i;
Border->BottomWidth = i;
Border->LeftWidth = i;
} }
return; return;
} }
@ -1629,10 +1561,7 @@ namespace NLGUI
{ {
if (!Border) if (!Border)
Border = new CSSBorderRenderer(); Border = new CSSBorderRenderer();
Border->TopColor = c; Border->setColor(c);
Border->RightColor = c;
Border->BottomColor = c;
Border->LeftColor = c;
} }
return; return;
} }
@ -1655,9 +1584,12 @@ namespace NLGUI
else else
if( name == "bgcolor" ) if( name == "bgcolor" )
{ {
if (!Background)
Background = new CSSBackgroundRenderer();
CRGBA c; CRGBA c;
if( fromString( value, c ) ) if( fromString( value, c ) )
BgColor = c; Background->setColor(c);
return; return;
} }
else else
@ -1680,12 +1612,16 @@ namespace NLGUI
xmlSetProp( node, BAD_CAST "type", BAD_CAST "table" ); xmlSetProp( node, BAD_CAST "type", BAD_CAST "table" );
if (Border) if (Border)
{ {
xmlSetProp( node, BAD_CAST "border", BAD_CAST toString( Border->TopWidth ).c_str() ); xmlSetProp( node, BAD_CAST "border", BAD_CAST toString( Border->getTopWidth() ).c_str() );
xmlSetProp( node, BAD_CAST "bordercolor", BAD_CAST toString( Border->TopColor ).c_str() ); xmlSetProp( node, BAD_CAST "bordercolor", BAD_CAST toString( Border->getTopColor() ).c_str() );
} }
xmlSetProp( node, BAD_CAST "cellpadding", BAD_CAST toString( CellPadding ).c_str() ); xmlSetProp( node, BAD_CAST "cellpadding", BAD_CAST toString( CellPadding ).c_str() );
xmlSetProp( node, BAD_CAST "cellspacing", BAD_CAST toString( CellSpacing ).c_str() ); xmlSetProp( node, BAD_CAST "cellspacing", BAD_CAST toString( CellSpacing ).c_str() );
xmlSetProp( node, BAD_CAST "bgcolor", BAD_CAST toString( BgColor ).c_str() ); if (Background)
{
xmlSetProp( node, BAD_CAST "bgcolor", BAD_CAST toString( Background->getColor() ).c_str() );
// TODO: Texture
}
if( ForceWidthMin != 0 ) if( ForceWidthMin != 0 )
xmlSetProp( node, BAD_CAST "width", BAD_CAST toString( ForceWidthMin ).c_str() ); xmlSetProp( node, BAD_CAST "width", BAD_CAST toString( ForceWidthMin ).c_str() );
@ -1708,7 +1644,7 @@ namespace NLGUI
fromString((const char*)ptr, w); fromString((const char*)ptr, w);
if (!Border) if (!Border)
Border = new CSSBorderRenderer(); Border = new CSSBorderRenderer();
Border->setWidth(w, w, w, w); Border->setWidth(w);
} }
// //
ptr = (char*) xmlGetProp( cur, (xmlChar*)"bordercolor" ); ptr = (char*) xmlGetProp( cur, (xmlChar*)"bordercolor" );
@ -1717,7 +1653,7 @@ namespace NLGUI
CRGBA c = convertColor((const char*)ptr); CRGBA c = convertColor((const char*)ptr);
if (!Border) if (!Border)
Border = new CSSBorderRenderer(); Border = new CSSBorderRenderer();
Border->setColor(c, c, c, c); Border->setColor(c);
} }
// //
ptr = (char*) xmlGetProp( cur, (xmlChar*)"cellpadding" ); ptr = (char*) xmlGetProp( cur, (xmlChar*)"cellpadding" );
@ -1735,7 +1671,10 @@ namespace NLGUI
ptr = (char*) xmlGetProp( cur, (xmlChar*)"bgcolor" ); ptr = (char*) xmlGetProp( cur, (xmlChar*)"bgcolor" );
if (ptr) if (ptr)
{ {
BgColor = convertColor((const char *) ptr); if (!Background)
Background = new CSSBackgroundRenderer();
Background->setColor(convertColor((const char *) ptr));
} }
// //
ptr = (char*) xmlGetProp( cur, (xmlChar*)"width" ); ptr = (char*) xmlGetProp( cur, (xmlChar*)"width" );

@ -142,30 +142,33 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
std::string CHtmlElement::htmlEscape(std::string val, bool isAttribute) const std::string CHtmlElement::htmlEscape(const std::string &val) const
{ {
static const std::string searchReplace[] = { if (val.find_first_of("\"'&<>\xA0") == std::string::npos)
"&", "&amp;", return val;
"<", "&lt;",
">", "&gt;", std::string ret;
"\xA0", "&nbsp;", // resize is quaranteed, make room for some free replacements
}; ret.reserve(val.size() + 24);
for(size_t pos = 0; pos != val.size(); pos++)
for(uint i = 0; i < (sizeof(searchReplace) / sizeof(searchReplace[0])); i+=2)
val = strFindReplaceAll(val, searchReplace[i], searchReplace[i+1]);
if (isAttribute)
{ {
static const std::string q = "\""; switch(val[pos])
static const std::string quot = "&quot;"; {
val = strFindReplaceAll(val, q, quot); case '"': ret.append("&quot;"); break;
case '\'': ret.append("&#39;"); break;
case '&': ret.append("&amp;"); break;
case '<': ret.append("&lt;"); break;
case '>': ret.append("&gt;"); break;
case '\xA0': ret.append("&nbsp;"); break;
default : ret.append(&val[pos],1); break;
}
} }
return val; return ret;
} }
// *************************************************************************** // ***************************************************************************
std::string CHtmlElement::serializeAttributes() const std::string CHtmlElement::serializeAttributes(bool escape) const
{ {
std::string result; std::string result;
for(std::map<std::string, std::string>::const_iterator it = Attributes.begin(); it != Attributes.end(); ++it) for(std::map<std::string, std::string>::const_iterator it = Attributes.begin(); it != Attributes.end(); ++it)
@ -179,30 +182,30 @@ namespace NLGUI
{ {
result += " "; result += " ";
} }
result += htmlEscape(*it2, true); result += (escape ? htmlEscape(*it2) : *it2);
} }
result += "\""; result += "\"";
} }
else else
{ {
result += " " + it->first + "=\"" + htmlEscape(it->second, true) + "\""; result += " " + it->first + "=\"" + (escape ? htmlEscape(it->second) : it->second) + "\"";
} }
} }
return result; return result;
} }
// *************************************************************************** // ***************************************************************************
std::string CHtmlElement::serializeChilds() const std::string CHtmlElement::serializeChilds(bool escape) const
{ {
std::string result; std::string result;
for(std::list<CHtmlElement>::const_iterator it = Children.begin(); it != Children.end(); ++it) for(std::list<CHtmlElement>::const_iterator it = Children.begin(); it != Children.end(); ++it)
result += it->serialize(); result += it->serialize(escape);
return result; return result;
} }
// *************************************************************************** // ***************************************************************************
std::string CHtmlElement::serialize() const std::string CHtmlElement::serialize(bool escape) const
{ {
if (Type == TEXT_NODE) if (Type == TEXT_NODE)
{ {
@ -211,12 +214,14 @@ namespace NLGUI
parent->ID == HTML_NOSCRIPT)) parent->ID == HTML_NOSCRIPT))
{ {
return Value; return Value;
} else { } else if (escape) {
return htmlEscape(Value); return htmlEscape(Value);
} else {
return Value;
} }
} }
std::string result = "<" + Value + serializeAttributes() + ">"; std::string result = "<" + Value + serializeAttributes(escape) + ">";
if (ID == HTML_AREA || ID == HTML_BASE || ID == HTML_BR || if (ID == HTML_AREA || ID == HTML_BASE || ID == HTML_BR ||
ID == HTML_COL || ID == HTML_EMBED || ID == HTML_HR || ID == HTML_COL || ID == HTML_EMBED || ID == HTML_HR ||
@ -231,7 +236,7 @@ namespace NLGUI
result += "\n"; result += "\n";
if (!Children.empty()) if (!Children.empty())
result += serializeChilds(); result += serializeChilds(escape);
result += "</" + Value + ">"; result += "</" + Value + ">";

@ -1,5 +1,5 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010-2018 Winch Gate Property Limited // Copyright (C) 2010-2020 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
@ -438,14 +438,6 @@ namespace NLGUI
parseSizeRef(sizeref.c_str()); parseSizeRef(sizeref.c_str());
} }
// ------------------------------------------------------------------------------------------------
std::string CInterfaceElement::getPosParent() const
{
std::string id;
getPosParent(id);
return id;
}
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
std::string CInterfaceElement::getSizeRefAsString() const std::string CInterfaceElement::getSizeRefAsString() const
{ {
@ -1172,6 +1164,8 @@ namespace NLGUI
{ {
_Active = state; _Active = state;
invalidateCoords(); invalidateCoords();
// force invalidate CViewText/CGroupTable inner elements
invalidateContent();
} }
} }

@ -206,15 +206,32 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
// *************************************************************************** // ***************************************************************************
bool getCssLength (float &value, std::string &unit, const std::string &str) bool getCssLength (float &value, std::string &unit, const std::string &str, bool neg)
{ {
static const std::set<std::string> knownUnits = {
"%", "rem", "em", "px", "pt", "vw", "vh", "vi", "vb", "vmin", "vmax"
};
std::string::size_type pos = 0; std::string::size_type pos = 0;
std::string::size_type len = str.size(); std::string::size_type len = str.size();
if (len == 1 && str[0] == '.') if (len == 0)
{ {
return false; return false;
} }
if (len == 1 && str[0] == '0')
{
value = 0;
unit.clear();
return true;
}
// +100px; -100px
if (str[0] == '+')
pos++;
else if (neg && str[0] == '-')
pos++;
while(pos < len) while(pos < len)
{ {
bool isNumeric = (str[pos] >= '0' && str[pos] <= '9') bool isNumeric = (str[pos] >= '0' && str[pos] <= '9')
@ -229,7 +246,7 @@ namespace NLGUI
} }
unit = toLowerAscii(str.substr(pos)); unit = toLowerAscii(str.substr(pos));
if (unit == "%" || unit == "rem" || unit == "em" || unit == "px" || unit == "pt") if (knownUnits.count(unit))
{ {
std::string tmpstr = str.substr(0, pos); std::string tmpstr = str.substr(0, pos);
return fromString(tmpstr, value); return fromString(tmpstr, value);
@ -611,6 +628,12 @@ namespace NLGUI
return false; return false;
} }
if (nlstricmp(src, "transparent") == 0)
{
dest = CRGBA::Transparent;
return true;
}
{ {
// slow but should suffice for now // slow but should suffice for now
for(uint k = 0; k < sizeofarray(htmlColorNameToRGBA); ++k) for(uint k = 0; k < sizeofarray(htmlColorNameToRGBA); ++k)

@ -42,6 +42,12 @@
#define assert(x) #define assert(x)
#endif #endif
// Always use unique_ptr with ValyriaTear/luabind on Ubuntu 20,
// since the setting is not stored in build_information.hpp
#ifndef LUABIND_USE_CXX11
#define LUABIND_USE_CXX11
#endif
#include <luabind/luabind.hpp> #include <luabind/luabind.hpp>
#include <nel/misc/algo.h> #include <nel/misc/algo.h>
#include <nel/misc/path.h> #include <nel/misc/path.h>

@ -48,6 +48,12 @@
# define assert(x) # define assert(x)
#endif #endif
// Always use unique_ptr with ValyriaTear/luabind on Ubuntu 20,
// since the setting is not stored in build_information.hpp
#ifndef LUABIND_USE_CXX11
#define LUABIND_USE_CXX11
#endif
#include <luabind/luabind.hpp> #include <luabind/luabind.hpp>
// in luabind > 0.6, LUABIND_MAX_ARITY is set to 10 // in luabind > 0.6, LUABIND_MAX_ARITY is set to 10
#if LUABIND_MAX_ARITY == 10 #if LUABIND_MAX_ARITY == 10
@ -220,7 +226,9 @@ namespace NLGUI
void CLuaIHM::push(CLuaState &ls, const ucstring &value) void CLuaIHM::push(CLuaState &ls, const ucstring &value)
{ {
//H_AUTO(Lua_CLuaIHM_push) //H_AUTO(Lua_CLuaIHM_push)
#if LUABIND_VERSION > 600 #if defined(LUABIND_STACK_HPP_INCLUDED)
luabind::push(ls.getStatePointer(), value);
#elif (LUABIND_VERSION > 600)
luabind::detail::push(ls.getStatePointer(), value); luabind::detail::push(ls.getStatePointer(), value);
#else #else
luabind::object obj(ls.getStatePointer(), value); luabind::object obj(ls.getStatePointer(), value);
@ -1115,7 +1123,6 @@ namespace NLGUI
if(!pIE) if(!pIE)
{ {
ls.pushNil(); ls.pushNil();
nlerror("getCurrentWindowUnder(): No UICaller found. return Nil");
} }
else else
{ {
@ -1156,7 +1163,9 @@ namespace NLGUI
case CInterfaceExprValue::RGBA: case CInterfaceExprValue::RGBA:
{ {
CRGBA color = value.getRGBA(); CRGBA color = value.getRGBA();
#if LUABIND_VERSION > 600 #if defined(LUABIND_STACK_HPP_INCLUDED)
luabind::push(ls.getStatePointer(), color);
#elif (LUABIND_VERSION > 600)
luabind::detail::push(ls.getStatePointer(), color); luabind::detail::push(ls.getStatePointer(), color);
#else #else
luabind::object obj(ls.getStatePointer(), color); luabind::object obj(ls.getStatePointer(), color);
@ -1416,7 +1425,9 @@ namespace NLGUI
case CReflectedProperty::UCString: case CReflectedProperty::UCString:
{ {
ucstring str = (reflectedObject.*(property.GetMethod.GetUCString))(); ucstring str = (reflectedObject.*(property.GetMethod.GetUCString))();
#if LUABIND_VERSION > 600 #if defined(LUABIND_STACK_HPP_INCLUDED)
luabind::push(ls.getStatePointer(), str);
#elif (LUABIND_VERSION > 600)
luabind::detail::push(ls.getStatePointer(), str); luabind::detail::push(ls.getStatePointer(), str);
#else #else
luabind::object obj(ls.getStatePointer(), str); luabind::object obj(ls.getStatePointer(), str);
@ -1427,7 +1438,9 @@ namespace NLGUI
case CReflectedProperty::UCStringRef: case CReflectedProperty::UCStringRef:
{ {
ucstring str = (reflectedObject.*(property.GetMethod.GetUCStringRef))(); ucstring str = (reflectedObject.*(property.GetMethod.GetUCStringRef))();
#if LUABIND_VERSION > 600 #if defined(LUABIND_STACK_HPP_INCLUDED)
luabind::push(ls.getStatePointer(), str);
#elif (LUABIND_VERSION > 600)
luabind::detail::push(ls.getStatePointer(), str); luabind::detail::push(ls.getStatePointer(), str);
#else #else
luabind::object obj(ls.getStatePointer(), str); luabind::object obj(ls.getStatePointer(), str);
@ -1442,7 +1455,9 @@ namespace NLGUI
case CReflectedProperty::RGBA: case CReflectedProperty::RGBA:
{ {
CRGBA color = (reflectedObject.*(property.GetMethod.GetRGBA))(); CRGBA color = (reflectedObject.*(property.GetMethod.GetRGBA))();
#if LUABIND_VERSION > 600 #if defined(LUABIND_STACK_HPP_INCLUDED)
luabind::push(ls.getStatePointer(), color);
#elif (LUABIND_VERSION > 600)
luabind::detail::push(ls.getStatePointer(), color); luabind::detail::push(ls.getStatePointer(), color);
#else #else
luabind::object obj(ls.getStatePointer(), color); luabind::object obj(ls.getStatePointer(), color);
@ -1656,7 +1671,7 @@ namespace NLGUI
ls.registerFunc("runFct", runFct); ls.registerFunc("runFct", runFct);
ls.registerFunc("runCommand", runCommand); ls.registerFunc("runCommand", runCommand);
ls.registerFunc("getPathContent", getPathContent); ls.registerFunc("getPathContent", getPathContent);
// Through LUABind API // Through LUABind API
lua_State *L= ls.getStatePointer(); lua_State *L= ls.getStatePointer();

@ -70,7 +70,17 @@ namespace NLGUI
} }
catch( const ELuaError &e ) catch( const ELuaError &e )
{ {
nlwarning( e.luaWhat().c_str() ); #if !FINAL_VERSION
nlwarning("--- LUA ERROR ---");
nlwarning(e.luaWhat().c_str());
std::vector<std::string> res;
NLMISC::explode(luaScript, std::string("\n"), res);
for(uint k = 0; k < res.size(); ++k)
{
nlwarning("%.05u %s", k, res[k].c_str());
}
nlwarning("--- ********* ---");
#endif
return false; return false;
} }

@ -46,8 +46,8 @@ namespace NLGUI
{ {
CGroupHTML *groupHtml = dynamic_cast<CGroupHTML*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:webig:content:html")); CGroupHTML *groupHtml = dynamic_cast<CGroupHTML*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:webig:content:html"));
if (groupHtml) { if (groupHtml) {
_HtmlDownload = false; groupHtml->removeImageDownload(_HtmlDownload, dynamic_cast<CViewBase*>(this));
groupHtml->removeImageDownload(dynamic_cast<CViewBase*>(this)); _HtmlDownload = NULL;
} }
} }
} }
@ -476,12 +476,20 @@ namespace NLGUI
if (!CFile::fileExists(localname)) if (!CFile::fileExists(localname))
localname = "web_del.tga"; localname = "web_del.tga";
_TextureId.setTexture (localname.c_str(), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false); _TextureId.setTexture (localname.c_str(), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false);
_HtmlDownload = true; _HtmlDownload = groupHtml->addImageDownload(TxName, dynamic_cast<CViewBase*>(this));
groupHtml->addImageDownload(TxName, dynamic_cast<CViewBase*>(this));
} }
} }
else else
{
if (_HtmlDownload)
{
CGroupHTML *groupHtml = dynamic_cast<CGroupHTML*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:webig:content:html"));
if (groupHtml)
groupHtml->removeImageDownload(_HtmlDownload, dynamic_cast<CViewBase*>(this));
_HtmlDownload = NULL;
}
_TextureId.setTexture (TxName.c_str (), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false); _TextureId.setTexture (TxName.c_str (), _TxtOffsetX, _TxtOffsetY, _TxtWidth, _TxtHeight, false);
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

@ -267,10 +267,18 @@ namespace NLGUI
TGlobalTextureList::iterator ite = _GlobalTextures.begin(); TGlobalTextureList::iterator ite = _GlobalTextures.begin();
while (ite != _GlobalTextures.end()) while (ite != _GlobalTextures.end())
{ {
UTextureFile *tf = dynamic_cast<NL3D::UTextureFile *>(ite->Texture); if (ite->Texture)
if (tf)
{ {
driver->deleteTextureFile (tf); UTextureFile *tf = dynamic_cast<NL3D::UTextureFile *>(ite->Texture);
if (tf)
{
driver->deleteTextureFile (tf);
}
else
{
UTextureMem *tf = dynamic_cast<NL3D::UTextureMem *>(ite->Texture);
if (tf) driver->deleteTextureMem(tf);
}
} }
ite++; ite++;
} }
@ -999,6 +1007,207 @@ namespace NLGUI
ite->Texture = externalTexture; ite->Texture = externalTexture;
} }
bool CViewRenderer::loadTextureFromString(CViewRenderer::SGlobalTexture *gt, const std::string &data)
{
size_t pos = data.find(";base64,");
if (pos == std::string::npos)
{
nlwarning("Data does not have 'data:image/...;base64,...' format '%s'", data.c_str());
return false;
}
std::string decoded = base64::decode(data.substr(pos + 8));
if (decoded.empty())
{
nlwarning("base64 decoding failed '%s", data.substr(pos + 8).c_str());
return false;
}
CMemStream buf;
if (buf.isReading()) buf.invert();
buf.serialBuffer((uint8 *)(decoded.data()), decoded.size());
buf.invert();
CBitmap btm;
btm.load(buf);
gt->Width = gt->DefaultWidth = btm.getWidth();;
gt->Height = gt->DefaultHeight = btm.getHeight();
if (gt->Width == 0 || gt->Height == 0)
{
nlwarning("Decoded image has width==0 || height==0, check image format. '%s'", data.c_str());
return false;
}
UTextureMem *texture = driver->createTextureMem(btm.getWidth(), btm.getHeight(), CBitmap::RGBA);
if (!texture)
{
nlwarning("Failed to create mem texture (%d,%d)", btm.getWidth(), btm.getHeight());
return false;
}
memcpy(texture->getPointer(), btm.getPixels().getPtr(), btm.getSize() * 4);
gt->Texture = texture;
gt->FromGlobaleTexture = false;
return true;
}
bool CViewRenderer::loadTextureFromFile(CViewRenderer::SGlobalTexture *gt, const std::string &filename)
{
// load new file
CIFile ifTmp;
if (ifTmp.open(filename))
{
CBitmap::loadSize (ifTmp, gt->Width, gt->Height);
gt->DefaultWidth = gt->Width;
gt->DefaultHeight = gt->Height;
if (gt->Width == 0 || gt->Height == 0)
{
nlwarning("Failed to load the texture '%s', please check image format", filename.c_str());
return false;
}
}
gt->Texture = driver->createTextureFile(filename);
gt->FromGlobaleTexture = false;
return true;
}
sint32 CViewRenderer::newTextureId(const std::string &name)
{
SImage iTmp;
iTmp.Name = toLowerAscii(name);
iTmp.UVMin = CUV(0,0);
iTmp.UVMax = CUV(1,1);
// lookup global texture with same name
TGlobalTextureList::iterator ite = _GlobalTextures.begin();
while (ite != _GlobalTextures.end())
{
std::string sText = toLowerAscii(ite->Name);
if (sText == iTmp.Name)
break;
ite++;
}
if (ite == _GlobalTextures.end())
{
SGlobalTexture gtTmp;
gtTmp.Name = iTmp.Name;
gtTmp.FromGlobaleTexture = false;
gtTmp.DefaultWidth = gtTmp.Width = 0;
gtTmp.DefaultHeight = gtTmp.Height = 0;
gtTmp.Texture = NULL;
_GlobalTextures.push_back(gtTmp);
ite = _GlobalTextures.end();
ite--;
}
iTmp.GlobalTexturePtr = &(*ite);
// allocate new texture id
return addSImage(iTmp);
}
void CViewRenderer::reloadTexture(sint32 texId, const std::string &name, bool uploadDXTC, bool bReleasable)
{
if ((uint)texId >= _SImageIterators.size())
{
nlwarning("Invalid texture id %d, maximum is %u", texId, _SImageIterators.size());
return;
}
SImage *sImage = getSImage(texId);
SGlobalTexture *gt = sImage->GlobalTexturePtr;
if (!gt)
{
nlwarning("Unknown texture id %d (file %s)", texId, name.c_str());
return;
}
// create new global texture if previous is atlas
if (gt->FromGlobaleTexture)
{
uint count = 0;
TSImageList::iterator ite = _SImages.begin();
while (ite != _SImages.end() && count != 2)
{
// Same global texture ?
if (ite->GlobalTexturePtr == gt)
count++;
ite++;
}
// create new only when atlas is used by 2+ textures
if (count == 2)
{
SGlobalTexture gtTmp;
gtTmp.Name = toLowerAscii(name);
gtTmp.FromGlobaleTexture = false;
gtTmp.DefaultWidth = gtTmp.Width = 0;
gtTmp.DefaultHeight = gtTmp.Height = 0;
gtTmp.Texture = NULL;
_GlobalTextures.push_back(gtTmp);
TGlobalTextureList::iterator ite = _GlobalTextures.end();
ite--;
sImage->GlobalTexturePtr = &(*ite);
gt = sImage->GlobalTexturePtr;
}
}
NL3D::UTexture *oldTexture = gt->Texture;
std::string sLwrGTName;
if (startsWith(name, "data:image/"))
{
if (!loadTextureFromString(gt, name))
return;
sLwrGTName = getMD5((uint8 *)name.c_str(), (uint32)name.size()).toString();
}
else
{
sLwrGTName = toLowerAscii(name);
std::string filename = CPath::lookup(sLwrGTName, false);
if (filename.empty())
{
nlwarning("Unable to find file '%s for texture %d", name.c_str(), texId);
return;
}
if (!loadTextureFromFile(gt, filename))
{
nlwarning("Unable to load texture from file '%s'", filename.c_str());
return;
}
}
gt->Name = sLwrGTName;
gt->Texture->setFilterMode(UTexture::Nearest, UTexture::NearestMipMapOff);
gt->Texture->setUploadFormat(uploadDXTC ? UTexture::DXTC5 : UTexture::Auto);
gt->Texture->setReleasable(bReleasable);
// release previous only after successfully loading new one
if (oldTexture)
{
UTextureFile *tf = dynamic_cast<NL3D::UTextureFile *>(oldTexture);
if (tf)
{
driver->deleteTextureFile (tf);
}
else
{
UTextureMem *tf = dynamic_cast<NL3D::UTextureMem *>(oldTexture);
if (tf) driver->deleteTextureMem(tf);
}
}
}
/* /*
* createTexture * createTexture
*/ */
@ -1030,27 +1239,20 @@ namespace NLGUI
// If global texture not exists create it // If global texture not exists create it
if (ite == _GlobalTextures.end()) if (ite == _GlobalTextures.end())
{ {
SGlobalTexture gtTmp;
gtTmp.FromGlobaleTexture = false;
string filename = CPath::lookup (sLwrGTName, false); string filename = CPath::lookup (sLwrGTName, false);
if (filename.empty() ) return -1; if (filename.empty() ) return -1;
CIFile ifTmp;
if (ifTmp.open(filename)) SGlobalTexture gtTmp;
{
CBitmap::loadSize (ifTmp, gtTmp.Width, gtTmp.Height);
gtTmp.DefaultWidth = gtTmp.Width;
gtTmp.DefaultHeight = gtTmp.Height;
if (gtTmp.Width == 0 || gtTmp.Height == 0)
{
nlwarning("Failed to load the texture '%s', please check image format", filename.c_str());
}
}
gtTmp.Texture = driver->createTextureFile (sLwrGTName);
gtTmp.Name = sLwrGTName; gtTmp.Name = sLwrGTName;
if (!loadTextureFromFile(&gtTmp, filename))
return -1;
gtTmp.Texture->setFilterMode(UTexture::Nearest, UTexture::NearestMipMapOff); gtTmp.Texture->setFilterMode(UTexture::Nearest, UTexture::NearestMipMapOff);
if(uploadDXTC) if(uploadDXTC)
gtTmp.Texture->setUploadFormat(UTexture::DXTC5); gtTmp.Texture->setUploadFormat(UTexture::DXTC5);
gtTmp.Texture->setReleasable(bReleasable); gtTmp.Texture->setReleasable(bReleasable);
_GlobalTextures.push_back(gtTmp); _GlobalTextures.push_back(gtTmp);
ite = _GlobalTextures.end(); ite = _GlobalTextures.end();
ite--; ite--;
@ -1105,44 +1307,10 @@ namespace NLGUI
// If global texture not exists create it // If global texture not exists create it
if (ite == _GlobalTextures.end()) if (ite == _GlobalTextures.end())
{ {
std::string decoded = base64::decode(data.substr(pos + 8));
if (decoded.empty())
{
nlwarning("base64 decode failed '%s'", data.substr(pos + 8).c_str());
return -1;
}
//
CMemStream buf;
if (buf.isReading()) buf.invert();
buf.serialBuffer((uint8 *)(decoded.data()), decoded.size());
buf.invert();
CBitmap btm;
btm.load(buf);
SGlobalTexture gtTmp; SGlobalTexture gtTmp;
gtTmp.FromGlobaleTexture = false; if (!loadTextureFromString(&gtTmp, data))
gtTmp.Width = gtTmp.DefaultWidth = btm.getWidth();;
gtTmp.Height = gtTmp.DefaultHeight = btm.getHeight();
if (gtTmp.Width == 0 || gtTmp.Height == 0)
{
nlwarning("Failed to load the texture '%s', please check image format", data.c_str());
return -1; return -1;
}
UTextureMem *texture = driver->createTextureMem(btm.getWidth(), btm.getHeight(), CBitmap::RGBA);
if (!texture)
{
nlwarning("Failed to create mem texture (%d,%d)", btm.getWidth(), btm.getHeight());
return -1;
}
memcpy(texture->getPointer(), btm.getPixels().getPtr(), btm.getSize() * 4);
gtTmp.Texture = texture;
gtTmp.Name = md5hash; gtTmp.Name = md5hash;
gtTmp.Texture->setFilterMode(UTexture::Nearest, UTexture::NearestMipMapOff); gtTmp.Texture->setFilterMode(UTexture::Nearest, UTexture::NearestMipMapOff);
gtTmp.Texture->setReleasable(bReleasable); gtTmp.Texture->setReleasable(bReleasable);
@ -1258,6 +1426,8 @@ namespace NLGUI
// This one ? // This one ?
if (&(*iteGT) == gt) if (&(*iteGT) == gt)
{ {
if (iteGT->Texture == NULL)
return;
// Remove this global texture // Remove this global texture
UTextureFile *tf = dynamic_cast<NL3D::UTextureFile *>(iteGT->Texture); UTextureFile *tf = dynamic_cast<NL3D::UTextureFile *>(iteGT->Texture);
if (tf) if (tf)
@ -1439,6 +1609,13 @@ namespace NLGUI
TGlobalTextureList::iterator ite = _GlobalTextures.begin(); TGlobalTextureList::iterator ite = _GlobalTextures.begin();
while (ite != _GlobalTextures.end()) while (ite != _GlobalTextures.end())
{ {
// texture not loaded yet
if (ite->Texture == NULL)
{
++ite;
continue;
}
// TMP TMP // TMP TMP
// volatile SGlobalTexture *sg = &(*ite); // volatile SGlobalTexture *sg = &(*ite);
CLayer &layer= ite->Layers[layerId]; CLayer &layer= ite->Layers[layerId];

@ -95,6 +95,7 @@ namespace NLGUI
_FontWidth= 0; _FontWidth= 0;
_FontHeight = 0; _FontHeight = 0;
_FontLegHeight = 0; _FontLegHeight = 0;
_TabWidth= 0;
_TextSelection= false; _TextSelection= false;
_TextSelectionStart= 0; _TextSelectionStart= 0;
@ -1029,7 +1030,10 @@ namespace NLGUI
if (_MultiLine) if (_MultiLine)
{ {
setTextFormatTaged(CI18N::get(propPtr)); if (NLMISC::startsWith(propPtr, "u:"))
setTextFormatTaged(std::string(propPtr).substr(2));
else
setTextFormatTaged(CI18N::get(propPtr));
} }
else else
{ {
@ -1281,7 +1285,7 @@ namespace NLGUI
px += firstSpace; px += firstSpace;
// skip tabulation before current word // skip tabulation before current word
if(currWord.Format.TabX) if(currWord.Format.TabX)
px= max(px, (float)(_XReal * _Scale + currWord.Format.TabX*_FontWidth)); px= max(px, (float)(_XReal * _Scale + currWord.Format.TabX*_TabWidth));
// draw. We take floorf px to avoid filtering of letters that are not located on a pixel boundary // draw. We take floorf px to avoid filtering of letters that are not located on a pixel boundary
float fx = px / _Scale; float fx = px / _Scale;
@ -1465,7 +1469,7 @@ namespace NLGUI
} }
} }
nlassert(_Text.empty() || ((_Localized && (NLMISC::startsWith(getText(), "ui"))) == (_HardText.empty() == _Text.empty()))); nlassert(_Text.empty() || ((_Localized && (NLMISC::startsWith(getHardText(), "ui"))) == (_HardText.empty() == _Text.empty())));
} }
// *************************************************************************** // ***************************************************************************
@ -1764,7 +1768,7 @@ namespace NLGUI
getFormatTagChange(i, formatTagIndex, wordFormat); getFormatTagChange(i, formatTagIndex, wordFormat);
// Ensure the line witdh count the tab // Ensure the line witdh count the tab
rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_FontWidth); rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_TabWidth);
} }
NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName);
@ -1948,7 +1952,7 @@ namespace NLGUI
// compute size of spaces/Tab + word // compute size of spaces/Tab + word
newLineWidth = lineWidth + numSpaces * _SpaceWidth; newLineWidth = lineWidth + numSpaces * _SpaceWidth;
newLineWidth = max(newLineWidth, (float)wordFormat.TabX*_FontWidth); newLineWidth = max(newLineWidth, (float)wordFormat.TabX*_TabWidth);
newLineWidth+= si.StringWidth; newLineWidth+= si.StringWidth;
} }
// //
@ -3110,8 +3114,6 @@ namespace NLGUI
TextContext->setEmbolden (_Embolden); TextContext->setEmbolden (_Embolden);
TextContext->setOblique (_Oblique); TextContext->setOblique (_Oblique);
#if 1
UTextContext::CStringInfo si = TextContext->getStringInfo("XO"); UTextContext::CStringInfo si = TextContext->getStringInfo("XO");
float xoHeight = si.StringHeight; float xoHeight = si.StringHeight;
@ -3142,34 +3144,14 @@ namespace NLGUI
si = TextContext->getStringInfo(" "); si = TextContext->getStringInfo(" ");
_SpaceWidth = si.StringWidth; _SpaceWidth = si.StringWidth;
// Font Width (used for <tab>) // Font Width
si = TextContext->getStringInfo("O"); si = TextContext->getStringInfo("O");
_FontWidth = si.StringWidth; _FontWidth = si.StringWidth;
#else // Tab Width (used for {Txx})
// if not set to "_", breaks item help window
// Letter size
UTextContext::CStringInfo si = TextContext->getStringInfo(_FontSizingChars);
// font generator changes unknown glyphs to dot '.'. use fallback if it looks odd
if (_FontSize > (si.StringHeight + si.StringLine))
{
si = TextContext->getStringInfo(_FontSizingFallback);
}
// add a padding of 1 pixel else the top will be truncated
_FontHeight = si.StringHeight + 1;
_FontLegHeight = si.StringLine;
// Space width
si = TextContext->getStringInfo(" ");
_SpaceWidth = si.StringWidth;
// Font Width (used for <tab>)
si = TextContext->getStringInfo("_"); si = TextContext->getStringInfo("_");
_FontWidth = si.StringWidth; _TabWidth = si.StringWidth;
#endif
} }
@ -3638,6 +3620,7 @@ namespace NLGUI
f.serial(_Localized); f.serial(_Localized);
SERIAL_SINT(_FontSize); SERIAL_SINT(_FontSize);
SERIAL_UINT(_FontWidth); SERIAL_UINT(_FontWidth);
SERIAL_UINT(_TabWidth);
SERIAL_UINT(_FontHeight); SERIAL_UINT(_FontHeight);
SERIAL_UINT(_FontLegHeight); SERIAL_UINT(_FontLegHeight);
f.serial(_SpaceWidth); f.serial(_SpaceWidth);

@ -435,22 +435,7 @@ namespace NLGUI
CWidgetManager::SMasterGroup &rMG = _MasterGroups[nMasterGroup]; CWidgetManager::SMasterGroup &rMG = _MasterGroups[nMasterGroup];
CInterfaceElement *pIEL = rMG.Group->getElement (sEltId); CInterfaceElement *pIEL = rMG.Group->getElement (sEltId);
if (pIEL != NULL) if (pIEL != NULL)
{
#if !FINAL_VERSION
if (m_LoggedMissingElement.find(sEltId) != m_LoggedMissingElement.end())
{
m_LoggedMissingElement.erase(sEltId);
nlwarning("Previously missing UI element with Id '%s' was now found!", sEltId.c_str());
}
#endif
return pIEL; return pIEL;
}
}
if (m_LoggedMissingElement.find(sEltId) == m_LoggedMissingElement.end())
{
m_LoggedMissingElement.insert(sEltId);
nlwarning("Could not find UI element from Id '%s'...", sEltId.c_str());
} }
return NULL; return NULL;
} }

@ -183,6 +183,21 @@ IF(WITH_GTK)
ENDIF() ENDIF()
ENDIF() ENDIF()
IF(HUNTER_ENABLED)
HUNTER_ADD_PACKAGE(Jpeg)
FIND_PACKAGE(JPEG CONFIG REQUIRED)
SET(JPEG_LIBRARY JPEG::jpeg)
HUNTER_ADD_PACKAGE(giflib)
FIND_PACKAGE(giflib CONFIG REQUIRED)
SET(GIF_LIBRARY giflib::giflib)
HUNTER_ADD_PACKAGE(PNG)
FIND_PACKAGE(PNG CONFIG REQUIRED)
SET(PNG_LIBRARY PNG::png)
SET(PNG_LIBRARIES PNG::png)
ENDIF()
IF(JPEG_FOUND) IF(JPEG_FOUND)
INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR})
ADD_DEFINITIONS(-DUSE_JPEG) ADD_DEFINITIONS(-DUSE_JPEG)
@ -202,6 +217,7 @@ ELSE()
TARGET_LINK_LIBRARIES(nelmisc ${PNG_LIBRARY}) TARGET_LINK_LIBRARIES(nelmisc ${PNG_LIBRARY})
ENDIF() ENDIF()
#TODO: needed for hunter aswell?
IF(UNIX) IF(UNIX)
TARGET_LINK_LIBRARIES(nelmisc -lc -ldl) TARGET_LINK_LIBRARIES(nelmisc -lc -ldl)
IF(APPLE) IF(APPLE)

@ -3269,77 +3269,79 @@ CRGBAF CBitmap::getColor (float x, float y) const
uint32 i; uint32 i;
bool isValid = true;
for (i = 0; i < 4; ++i) for (i = 0; i < 4; ++i)
{ {
nlassert (nX[i] >= 0); if (nX[i] < 0 || nY[i] < 0 || nX[i] >= nWidth || nY[i] >= nHeight)
nlassert (nY[i] >= 0 ); isValid = false;
nlassert (nX[i] < nWidth);
nlassert (nY[i] < nHeight);
} }
// Decimal part of (x,y) if (isValid)
x = x - (float)nX[0];
y = y - (float)nY[0];
switch (this->PixelFormat)
{ {
case RGBA: // Decimal part of (x,y)
case DXTC1: x = x - (float)nX[0];
case DXTC1Alpha: y = y - (float)nY[0];
case DXTC3:
case DXTC5:
{
CRGBAF finalVal;
CRGBA val[4];
if (this->PixelFormat == RGBA) switch (this->PixelFormat)
{
case RGBA:
case DXTC1:
case DXTC1Alpha:
case DXTC3:
case DXTC5:
{ {
for (i = 0; i < 4; ++i) CRGBAF finalVal;
CRGBA val[4];
if (this->PixelFormat == RGBA)
{ {
val[i] = CRGBA (rBitmap[(nX[i]+nY[i]*nWidth)*4+0], for (i = 0; i < 4; ++i)
rBitmap[(nX[i]+nY[i]*nWidth)*4+1], {
rBitmap[(nX[i]+nY[i]*nWidth)*4+2], val[i] = CRGBA (rBitmap[(nX[i]+nY[i]*nWidth)*4+0],
rBitmap[(nX[i]+nY[i]*nWidth)*4+3]); rBitmap[(nX[i]+nY[i]*nWidth)*4+1],
rBitmap[(nX[i]+nY[i]*nWidth)*4+2],
rBitmap[(nX[i]+nY[i]*nWidth)*4+3]);
}
} }
} else
else
{
// slower version : get from DXT
for (i = 0; i < 4; ++i)
{ {
val[i] = getPixelColor(nX[i], nY[i]); // slower version : get from DXT
for (i = 0; i < 4; ++i)
{
val[i] = getPixelColor(nX[i], nY[i]);
}
} }
}
finalVal.R = getColorInterp (x, y, val[0].R, val[1].R, val[2].R, val[3].R); finalVal.R = getColorInterp (x, y, val[0].R, val[1].R, val[2].R, val[3].R);
finalVal.G = getColorInterp (x, y, val[0].G, val[1].G, val[2].G, val[3].G); finalVal.G = getColorInterp (x, y, val[0].G, val[1].G, val[2].G, val[3].G);
finalVal.B = getColorInterp (x, y, val[0].B, val[1].B, val[2].B, val[3].B); finalVal.B = getColorInterp (x, y, val[0].B, val[1].B, val[2].B, val[3].B);
finalVal.A = getColorInterp (x, y, val[0].A, val[1].A, val[2].A, val[3].A); finalVal.A = getColorInterp (x, y, val[0].A, val[1].A, val[2].A, val[3].A);
finalVal /= 255.f; finalVal /= 255.f;
return finalVal; return finalVal;
} }
break; break;
case Alpha: case Alpha:
case Luminance: case Luminance:
{ {
float finalVal; float finalVal;
float val[4]; float val[4];
for (i = 0; i < 4; ++i) for (i = 0; i < 4; ++i)
val[i] = rBitmap[(nX[i]+nY[i]*nWidth)]; val[i] = rBitmap[(nX[i]+nY[i]*nWidth)];
finalVal = getColorInterp (x, y, val[0], val[1], val[2], val[3]); finalVal = getColorInterp (x, y, val[0], val[1], val[2], val[3]);
finalVal /= 255.f; finalVal /= 255.f;
if (this->PixelFormat == Alpha) if (this->PixelFormat == Alpha)
return CRGBAF (1.f, 1.f, 1.f, finalVal); return CRGBAF (1.f, 1.f, 1.f, finalVal);
else // Luminance else // Luminance
return CRGBAF (finalVal, finalVal, finalVal, 1.f); return CRGBAF (finalVal, finalVal, finalVal, 1.f);
}
break;
default: break;
} }
break;
default: break;
} }
return CRGBAF (0.0f, 0.0f, 0.0f, 0.0f); return CRGBAF (0.0f, 0.0f, 0.0f, 0.0f);
@ -3626,7 +3628,7 @@ void CBitmap::loadSize(NLMISC::IStream &f, uint32 &retWidth, uint32 &retHeight)
{ {
uint8 imagePrecision = 0; // sample precision uint8 imagePrecision = 0; // sample precision
uint32 imageSize = 0; // width and height uint32 imageSize = 0; // width and height
f.serial(imagePrecision); f.serial(imagePrecision);
f.serial(imageSize); f.serial(imageSize);
NLMISC_BSWAP32(imageSize); NLMISC_BSWAP32(imageSize);

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2016 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -55,11 +55,11 @@ void CCDBNodeLeaf::init( xmlNodePtr node, IProgressCallback &/* progressCallBac
CXMLAutoPtr nullable((const char*)xmlGetProp (node, (xmlChar*)"nullable")); CXMLAutoPtr nullable((const char*)xmlGetProp (node, (xmlChar*)"nullable"));
if ((const char *) nullable != NULL) if ((const char *) nullable != NULL)
{ {
_Nullable = (nullable.getDatas()[0] == '1'); m_Nullable = (nullable.getDatas()[0] == '1');
} }
else else
{ {
_Nullable = false; m_Nullable = false;
} }
// Read type // Read type
@ -99,9 +99,6 @@ void CCDBNodeLeaf::init( xmlNodePtr node, IProgressCallback &/* progressCallBac
// IF it is a TEXT. // IF it is a TEXT.
if(!strcmp(type, "TEXT")) if(!strcmp(type, "TEXT"))
_Type = ICDBNode::TEXT; _Type = ICDBNode::TEXT;
// IF it is a PACKED.
else if (!strcmp(type, "PACKED"))
_Type = ICDBNode::PACKED;
// ELSE type unknown. // ELSE type unknown.
else else
{ {
@ -146,15 +143,6 @@ void CCDBNodeLeaf::write( CTextId& id, FILE * f)
fprintf(f,"%" NL_I64 "d\t%s\n",_Property,id.toString().c_str()); fprintf(f,"%" NL_I64 "d\t%s\n",_Property,id.toString().c_str());
} // write // } // write //
inline uint readPackedBitCount(CBitMemStream & f)
{
uint64 nibbleCount;
f.serial(nibbleCount, 4);
uint bits = (nibbleCount << 2) + 4;
// nlinfo("PACKED: %u bits", (uint32)(bits));
return bits;
}
//----------------------------------------------- //-----------------------------------------------
// readDelta // readDelta
//----------------------------------------------- //-----------------------------------------------
@ -167,24 +155,20 @@ void CCDBNodeLeaf::readDelta(TGameCycle gc, CBitMemStream & f )
uint64 recvd = 0; uint64 recvd = 0;
uint64 isNull = 0; uint64 isNull = 0;
if (_Nullable) if (m_Nullable)
{ {
f.serial(isNull, 1); f.serial(isNull, 1);
} }
uint bits; uint bits;
if (!isNull) if (_Type == TEXT)
{ bits = 32;
if (_Type == TEXT) else if (_Type <= I64)
bits = 32; bits = _Type;
else if (_Type == PACKED) else
bits = readPackedBitCount(f); bits = _Type - 64;
else if (_Type <= I64) f.serial(recvd, bits);
bits = _Type;
else
bits = _Type - 64;
f.serial(recvd, bits);
}
// if the DB update is older than last DB update, abort (but after the read!!) // if the DB update is older than last DB update, abort (but after the read!!)
if(gc<_LastChangeGC) if(gc<_LastChangeGC)
@ -197,24 +181,18 @@ void CCDBNodeLeaf::readDelta(TGameCycle gc, CBitMemStream & f )
_Property = (sint64)recvd; _Property = (sint64)recvd;
// if signed // if signed
if (! ((_Type == TEXT) || (_Type == PACKED) || (_Type <= I64))) if (! ((_Type == TEXT) || (_Type <= I64)))
{ {
if (!isNull) // extend bit sign
sint64 mask = (((sint64)1)<<bits)-(sint64)1;
if( (_Property >> (bits-1))==1 )
{ {
// extend bit sign _Property |= ~mask;
sint64 mask = (((sint64)1)<<bits)-(sint64)1;
if( (_Property >> (bits-1))==1 )
{
_Property |= ~mask;
}
} }
} }
if ( verboseDatabase ) if ( verboseDatabase )
{ {
if (!isNull) nlinfo( "CDB: Read value (%u bits) %" NL_I64 "d", bits, _Property );
nlinfo( "CDB: Read value (%u bits) %" NL_I64 "d", bits, _Property );
else
nlinfo( "CDB: Read null value %" NL_I64 "d", _Property );
} }
// bkup the date of change // bkup the date of change

@ -52,8 +52,9 @@ ICommand::ICommand(const char *categoryName, const char *commandName, const char
if (comm != LocalCommands->end ()) if (comm != LocalCommands->end ())
{ {
nlinfo("command with same name: %s", commandName);
// 2 commands have the same name // 2 commands have the same name
nlstopex (("There are 2 commands that have the same name in the project (command name '%s'), skip the second definition", commandName)); // nlstopex (("There are 2 commands that have the same name in the project (command name '%s'), skip the second definition", commandName));
} }
else else
{ {

@ -288,7 +288,7 @@ void CEntityIdTranslator::registerEntity (const CEntityId &eid, const ucstring &
return; return;
} }
nlinfo ("EIT: Register EId %s EntityName '%s' UId %d UserName '%s'", reid.toString().c_str(), entityName.toString().c_str(), uid, userName.c_str()); //nlinfo ("EIT: Register EId %s EntityName '%s' UId %d UserName '%s'", reid.toString().c_str(), entityName.toString().c_str(), uid, userName.c_str());
RegisteredEntities.insert (make_pair(reid, CEntityIdTranslator::CEntity(entityName, uid, userName, entitySlot, shardId))); RegisteredEntities.insert (make_pair(reid, CEntityIdTranslator::CEntity(entityName, uid, userName, entitySlot, shardId)));
NameIndex.insert(make_pair(toLower(entityName), reid)); NameIndex.insert(make_pair(toLower(entityName), reid));
} }

@ -17,7 +17,6 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdmisc.h"
#include <nel/misc/seven_zip.h> #include <nel/misc/seven_zip.h>
#include <nel/misc/types_nl.h> #include <nel/misc/types_nl.h>

@ -188,6 +188,7 @@
# endif // NL_CPU_INTEL # endif // NL_CPU_INTEL
# ifdef NL_OS_MAC # ifdef NL_OS_MAC
# include <sys/mount.h> # include <sys/mount.h>
# include <sys/sysctl.h>
# else # else
# include <sys/vfs.h> # include <sys/vfs.h>
# endif # endif

@ -266,14 +266,9 @@ void uncbServiceIdentification(CMessage &msgin, TSockId from, CCallbackNetBase &
nlinfo ("HNETL5: + connect ident '%s' %s-%hu pos %hu ext %d", from->asString().c_str(), inSName.c_str(), inSid.get(), (uint16)pos, (uint8)isExternal); nlinfo ("HNETL5: + connect ident '%s' %s-%hu pos %hu ext %d", from->asString().c_str(), inSName.c_str(), inSid.get(), (uint16)pos, (uint8)isExternal);
if (isExternal) if(isExternal)
{ {
nlassert (pos == 0);
#ifdef NL_OS_WINDOWS
pos = 0;
#else
nlassert(pos == 0);
#endif
} }
if (inSid.get() == 0) if (inSid.get() == 0)

@ -2,7 +2,7 @@
// Copyright (C) 2010-2019 Winch Gate Property Limited // Copyright (C) 2010-2019 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2019-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -418,8 +418,7 @@ void CMoveContainer::updateCells (CMovePrimitive *primitive, uint8 worldImage)
CPrimitiveWorldImage *wI=primitive->getWorldImage (worldImage); CPrimitiveWorldImage *wI=primitive->getWorldImage (worldImage);
#if !FINAL_VERSION #if !FINAL_VERSION
#ifndef RYZOM_FORGE /* // Check BB width not too large
// Check BB width not too large
if (wI->getBBXMax() - wI->getBBXMin() > _CellWidth) if (wI->getBBXMax() - wI->getBBXMin() > _CellWidth)
{ {
nlwarning ("Primitives have moved more than a cell, width: %f.", (float)(wI->getBBXMax() - wI->getBBXMin())); nlwarning ("Primitives have moved more than a cell, width: %f.", (float)(wI->getBBXMax() - wI->getBBXMin()));
@ -430,7 +429,7 @@ void CMoveContainer::updateCells (CMovePrimitive *primitive, uint8 worldImage)
{ {
nlwarning ("Primitives have moved more than a cell, height: %f.", (float)(wI->getBBYMax() - wI->getBBYMin())); nlwarning ("Primitives have moved more than a cell, height: %f.", (float)(wI->getBBYMax() - wI->getBBYMin()));
} }
#endif */
#endif #endif
// Get coordinate in the cell array // Get coordinate in the cell array

@ -90,6 +90,23 @@ SOURCE_GROUP("user_classes" FILES ${USER_CLASSES})
NL_TARGET_LIB(nelsound ${HEADERS} ${SRC}) NL_TARGET_LIB(nelsound ${HEADERS} ${SRC})
IF(HUNTER_ENABLED)
HUNTER_ADD_PACKAGE(libogg)
FIND_PACKAGE(libogg CONFIG REQUIRED)
SET(OGG_LIBRARY libogg::ogg)
SET(OGG_LIBRARIES libogg::ogg)
HUNTER_ADD_PACKAGE(vorbis)
FIND_PACKAGE(vorbis CONFIG REQUIRED)
SET(VORBIS_LIBRARY vorbis::vorbis)
SET(VORBISFILE_LIBRARY vorbis::vorbisfile)
IF(WITH_FFMPEG)
HUNTER_ADD_PACKAGE(ffmpeg)
FIND_PACKAGE(ffmpeg CONFIG REQUIRED)
SET(FFMPEG_LIBRARIES ffmpeg::avcodec ffmpeg::avformat ffmpeg::avutil ffmpeg::swresample)
ENDIF()
ENDIF()
INCLUDE_DIRECTORIES(${VORBIS_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${VORBIS_INCLUDE_DIR})
INCLUDE_DIRECTORIES(${OGG_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${OGG_INCLUDE_DIR})

@ -26,9 +26,16 @@ SOURCE_GROUP(util FILES
NL_TARGET_DRIVER(${NLDRV_AL_LIB} ${SRC}) NL_TARGET_DRIVER(${NLDRV_AL_LIB} ${SRC})
INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR}) IF(HUNTER_ENABLED)
HUNTER_ADD_PACKAGE(OpenAL)
FIND_PACKAGE(OpenAL CONFIG REQUIRED)
SET(OPENAL_LIBRARY OpenAL::OpenAL)
ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
ELSE()
INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
ENDIF()# hunter
TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} ${OPENAL_LIBRARY} nelmisc nelsnd_lowlevel) TARGET_LINK_LIBRARIES(${NLDRV_AL_LIB} nelmisc nelsnd_lowlevel ${OPENAL_LIBRARY})
NL_DEFAULT_PROPS(${NLDRV_AL_LIB} "NeL, Driver, Sound: OpenAL") NL_DEFAULT_PROPS(${NLDRV_AL_LIB} "NeL, Driver, Sound: OpenAL")
NL_ADD_RUNTIME_FLAGS(${NLDRV_AL_LIB}) NL_ADD_RUNTIME_FLAGS(${NLDRV_AL_LIB})
NL_ADD_LIB_SUFFIX(${NLDRV_AL_LIB}) NL_ADD_LIB_SUFFIX(${NLDRV_AL_LIB})

@ -66,6 +66,7 @@ void alExtInitDevice(ALCdevice *device)
} }
} }
#if !defined(AL_LIBTYPE_STATIC)
// Windows and Mac OS always link to shared OpenAL library // Windows and Mac OS always link to shared OpenAL library
#if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC) #if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC)
// EFX // EFX
@ -114,6 +115,7 @@ void alExtInitDevice(ALCdevice *device)
} }
} }
#endif #endif
#endif
} }
#if EAX_AVAILABLE #if EAX_AVAILABLE
@ -137,6 +139,7 @@ EAXGetBufferMode eaxGetBufferMode = NULL;
// ALC_EXT_EFX // ALC_EXT_EFX
bool AlExtEfx = false; bool AlExtEfx = false;
// effect objects // effect objects
#if !defined(AL_LIBTYPE_STATIC)
#if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC) #if defined(NL_OS_WINDOWS) || defined(NL_OS_MAC) || !defined(NL_STATIC)
LPALGENEFXOBJECTS alGenEffects = NULL; LPALGENEFXOBJECTS alGenEffects = NULL;
LPALDELETEEFXOBJECTS alDeleteEffects = NULL; LPALDELETEEFXOBJECTS alDeleteEffects = NULL;
@ -174,6 +177,7 @@ LPALGETEFXOBJECTIV alGetAuxiliaryEffectSlotiv = NULL;
LPALGETEFXOBJECTF alGetAuxiliaryEffectSlotf = NULL; LPALGETEFXOBJECTF alGetAuxiliaryEffectSlotf = NULL;
LPALGETEFXOBJECTFV alGetAuxiliaryEffectSlotfv = NULL; LPALGETEFXOBJECTFV alGetAuxiliaryEffectSlotfv = NULL;
#endif #endif
#endif
} }
/* end of file */ /* end of file */

@ -262,7 +262,7 @@ void CSound::importForm(const std::string& filename, NLGEORGES::UFormElm& roo
_GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_GROUP_CONTROLLER); _GroupController = CGroupControllerRoot::getInstance()->getGroupController(NLSOUND_SHEET_V1_DEFAULT_SOUND_GROUP_CONTROLLER);
#else #else
std::string groupControllerPath; std::string groupControllerPath;
root.getValueByName(groupControllerPath, ".GroupController"); root.getValueByName(groupControllerPath, ".GroupControllerPath");
_GroupController = CGroupControllerRoot::getInstance()->getGroupController(groupControllerPath); _GroupController = CGroupControllerRoot::getInstance()->getGroupController(groupControllerPath);
#endif #endif

@ -131,13 +131,6 @@ namespace NLWEB
// only use OpenSSL callback if not using Windows SSPI and using OpenSSL backend // only use OpenSSL callback if not using Windows SSPI and using OpenSSL backend
if (useOpenSSLBackend && !(data && data->features & CURL_VERSION_SSPI)) if (useOpenSSLBackend && !(data && data->features & CURL_VERSION_SSPI))
{ {
#ifdef NL_OS_WINDOWS
// load native Windows CA Certs
addCertificatesFrom("CA");
addCertificatesFrom("AuthRoot");
addCertificatesFrom("ROOT");
#endif
isUsingOpenSSLBackend = true; isUsingOpenSSLBackend = true;
} }
else else
@ -179,40 +172,6 @@ namespace NLWEB
return name; return name;
} }
#ifdef NL_OS_WINDOWS
void addCertificatesFrom(LPCSTR root)
{
HCERTSTORE hStore;
PCCERT_CONTEXT pContext = NULL;
X509 *x509;
hStore = CertOpenSystemStore(NULL, root);
if (hStore)
{
while (pContext = CertEnumCertificatesInStore(hStore, pContext))
{
x509 = NULL;
x509 = d2i_X509(NULL, (const unsigned char **)&pContext->pbCertEncoded, pContext->cbCertEncoded);
if (x509)
{
CertEntry entry;
entry.cert = x509;
entry.file = root;
entry.name = getCertName(x509);
CertList.push_back(entry);
}
}
CertFreeCertificateContext(pContext);
CertCloseStore(hStore, 0);
}
// this is called before debug context is set and log ends up in log.log
//nlinfo("Loaded %d certificates from '%s' certificate store", (int)CertList.size(), root);
}
#endif
void addCertificatesFromFile(const std::string &cert) void addCertificatesFromFile(const std::string &cert)
{ {
if (!isInitialized) if (!isInitialized)

@ -75,8 +75,9 @@ static const std::string CAFilename = "cacert.pem"; // https://curl.haxx.se/docs
// *************************************************************************** // ***************************************************************************
bool CCurlHttpClient::verifyServer(bool verify) bool CCurlHttpClient::verifyServer(bool verify)
{ {
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, verify ? 2 : 0); m_Verify = verify;
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, verify ? 1 : 0); curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, verify ? 1 : 0);
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, verify ? 2 : 0);
// specify custom CA certs // specify custom CA certs
CCurlCertificates::addCertificateFile(CAFilename); CCurlCertificates::addCertificateFile(CAFilename);
@ -97,8 +98,8 @@ bool CCurlHttpClient::sendRequest(const std::string& methodWB, const std::string
curl_easy_setopt(_Curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(_Curl, CURLOPT_URL, url.c_str());
if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https if (url.length() > 8 && (url[4] == 's' || url[4] == 'S')) // 01234 https
{ {
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, 1L); curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYPEER, m_Verify ? 1L : 0);
curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, 2L); curl_easy_setopt(_Curl, CURLOPT_SSL_VERIFYHOST, m_Verify ? 2L : 0);
} }
// Authentication // Authentication
@ -124,15 +125,17 @@ bool CCurlHttpClient::sendRequest(const std::string& methodWB, const std::string
curl_easy_setopt(_Curl, CURLOPT_WRITEFUNCTION, CCurlHttpClient::writeDataFromCurl); curl_easy_setopt(_Curl, CURLOPT_WRITEFUNCTION, CCurlHttpClient::writeDataFromCurl);
curl_easy_setopt(_Curl, CURLOPT_WRITEDATA, this); curl_easy_setopt(_Curl, CURLOPT_WRITEDATA, this);
char errorbuf [CURL_ERROR_SIZE+1]; if (!m_ErrorBuf.size())
curl_easy_setopt(_Curl, CURLOPT_ERRORBUFFER, errorbuf); m_ErrorBuf.resize(CURL_ERROR_SIZE + 1);
m_ErrorBuf[0] = '\0';
curl_easy_setopt(_Curl, CURLOPT_ERRORBUFFER, &m_ErrorBuf[0]);
// Send // Send
CURLcode res = curl_easy_perform(_Curl); CURLcode res = curl_easy_perform(_Curl);
if (res != 0) if (res != 0)
{ {
if (verbose) if (verbose)
nlwarning(errorbuf); nlwarning(&m_ErrorBuf[0]);
return false; return false;
} }

@ -65,214 +65,158 @@ if not args.noconf:
except NameError: except NameError:
BuildQuality = 1 BuildQuality = 1
try: try:
if args.preset: if not args.preset:
DummyUnknownName ToolDirectories
RemapLocalFrom
except NameError: except NameError:
RemapLocalFrom = 'R:' ToolDirectories = [ 'R:/distribution/nel_tools_win_x64-distribution', 'R:/distribution/ryzom_tools_win_x64-distribution' ]
try:
if args.preset:
DummyUnknownName
RemapLocalTo
except NameError:
RemapLocalTo = os.getenv('RC_ROOT').replace('\\', '/')
if (not RemapLocalTo) or (not ':' in RemapLocalTo):
RemapLocalTo = 'R:'
try:
if args.preset:
DummyUnknownName
ToolDirectories
except NameError:
ToolDirectories = [ 'R:/distribution/nel_tools_win_x64', 'R:/distribution/ryzom_tools_win_x64' ]
try: try:
ToolSuffix ToolSuffix
except NameError: except NameError:
ToolSuffix = ".exe" ToolSuffix = ".exe"
try: try:
if args.preset: if not args.preset:
DummyUnknownName ScriptDirectory
ScriptDirectory
except NameError: except NameError:
ScriptDirectory = "R:/code/nel/tools/build_gamedata" ScriptDirectory = "R:/code/nel/tools/build_gamedata"
try: try:
if args.preset: if not args.preset:
DummyUnknownName WorkspaceDirectory
WorkspaceDirectory
except NameError: except NameError:
WorkspaceDirectory = "R:/leveldesign/workspace" WorkspaceDirectory = "R:/leveldesign/workspace"
try: try:
if args.preset: if not args.preset:
DummyUnknownName DatabaseDirectory
DatabaseDirectory
except NameError: except NameError:
DatabaseDirectory = "R:/graphics" DatabaseDirectory = "R:/graphics"
try: try:
if args.preset: if not args.preset:
DummyUnknownName SoundDirectory
SoundDirectory
except NameError: except NameError:
SoundDirectory = "R:/sound" SoundDirectory = "R:/sound"
try: try:
if args.preset: if not args.preset:
DummyUnknownName SoundDfnDirectory
SoundDfnDirectory
except NameError: except NameError:
SoundDfnDirectory = "R:/sound/DFN" SoundDfnDirectory = "R:/sound/DFN"
try: try:
if args.preset: if not args.preset:
DummyUnknownName ExportBuildDirectory
ExportBuildDirectory
except NameError: except NameError:
ExportBuildDirectory = "R:/pipeline/export" ExportBuildDirectory = "R:/pipeline/export"
try: try:
if args.preset: if not args.preset:
DummyUnknownName InstallDirectory
InstallDirectory
except NameError: except NameError:
InstallDirectory = "R:/pipeline/install" InstallDirectory = "R:/pipeline/install"
try: try:
if args.preset: if not args.preset:
DummyUnknownName ClientDevDirectory
ClientDevDirectory
except NameError: except NameError:
ClientDevDirectory = "R:/pipeline/client_dev" ClientDevDirectory = "R:/pipeline/client_dev"
try: try:
if args.preset: if not args.preset:
DummyUnknownName ClientPatchDirectory
ClientDevLiveDirectory
except NameError:
ClientDevLiveDirectory = "R:/pipeline/client_dev_live"
try:
if args.preset:
DummyUnknownName
ClientPatchDirectory
except NameError: except NameError:
ClientPatchDirectory = "R:/pipeline/client_patch" ClientPatchDirectory = "R:/pipeline/client_patch"
try: try:
if args.preset: if not args.preset:
DummyUnknownName ClientInstallDirectory
ClientInstallDirectory
except NameError: except NameError:
ClientInstallDirectory = "R:/pipeline/client_install" ClientInstallDirectory = "R:/pipeline/client_install"
try: try:
if args.preset: if not args.preset:
DummyUnknownName ShardInstallDirectory
ShardInstallDirectory
except NameError: except NameError:
ShardInstallDirectory = "R:/pipeline/shard" ShardInstallDirectory = "R:/pipeline/shard"
try: try:
if args.preset: if not args.preset:
DummyUnknownName WorldEditInstallDirectory
ShardDevDirectory
except NameError:
ShardDevDirectory = "R:/pipeline/shard_dev"
try:
if args.preset:
DummyUnknownName
WorldEditInstallDirectory
except NameError: except NameError:
WorldEditInstallDirectory = "R:/pipeline/worldedit" WorldEditInstallDirectory = "R:/pipeline/worldedit"
try: try:
if args.preset: if not args.preset:
DummyUnknownName WorldEditorFilesDirectory
WorldEditorFilesDirectory
except NameError: except NameError:
WorldEditorFilesDirectory = "R:/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files" WorldEditorFilesDirectory = "R:/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files"
try: try:
if args.preset: if not args.preset:
DummyUnknownName LeveldesignDirectory
LeveldesignDirectory
except NameError: except NameError:
LeveldesignDirectory = "R:/leveldesign" LeveldesignDirectory = "R:/leveldesign"
try: try:
if args.preset: if not args.preset:
DummyUnknownName LeveldesignDfnDirectory
LeveldesignDfnDirectory
except NameError: except NameError:
LeveldesignDfnDirectory = "R:/leveldesign/DFN" LeveldesignDfnDirectory = "R:/leveldesign/DFN"
try: try:
if args.preset: if not args.preset:
DummyUnknownName LeveldesignWorldDirectory
LeveldesignWorldDirectory
except NameError: except NameError:
LeveldesignWorldDirectory = "R:/leveldesign/world" LeveldesignWorldDirectory = "R:/leveldesign/world"
try: try:
if args.preset: if not args.preset:
DummyUnknownName PrimitivesDirectory
PrimitivesDirectory
except NameError: except NameError:
PrimitivesDirectory = "R:/leveldesign/primitives" PrimitivesDirectory = "R:/leveldesign/primitives"
try: try:
if args.preset: if not args.preset:
DummyUnknownName LeveldesignDataCommonDirectory
LeveldesignDataCommonDirectory
except NameError: except NameError:
LeveldesignDataCommonDirectory = "R:/leveldesign/common" LeveldesignDataCommonDirectory = "R:/leveldesign/common"
try: try:
if args.preset: if not args.preset:
DummyUnknownName LeveldesignDataShardDirectory
LeveldesignDataShardDirectory
except NameError: except NameError:
LeveldesignDataShardDirectory = "R:/leveldesign/shard" LeveldesignDataShardDirectory = "R:/leveldesign/shard"
try: try:
if args.preset: if not args.preset:
DummyUnknownName TranslationDirectory
TranslationDirectory
except NameError: except NameError:
TranslationDirectory = "R:/leveldesign/translation" TranslationDirectory = "R:/leveldesign/translation"
try: try:
if args.preset: if not args.preset:
DummyUnknownName GamedevDirectory
GamedevDirectory
except NameError: except NameError:
GamedevDirectory = "R:/code/ryzom/client/data/gamedev" GamedevDirectory = "R:/code/ryzom/client/data/gamedev"
try: try:
if args.preset: if not args.preset:
DummyUnknownName DataCommonDirectory
DataCommonDirectory
except NameError: except NameError:
DataCommonDirectory = "R:/code/ryzom/common/data_common" DataCommonDirectory = "R:/code/ryzom/common/data_common"
try: try:
if args.preset: if not args.preset:
DummyUnknownName DataShardDirectory
DataShardDirectory
except NameError: except NameError:
DataShardDirectory = "R:/code/ryzom/server/data_shard" DataShardDirectory = "R:/code/ryzom/server/data_shard"
try: try:
if args.preset: if not args.preset:
DummyUnknownName WindowsExeDllCfgDirectories
WindowsExeDllCfgDirectories
except NameError: except NameError:
# TODO: Separate 64bit and 32bit # TODO: Separate 64bit and 32bit
WindowsExeDllCfgDirectories = [ '', 'R:/build/fv_x64/bin/Release', 'R:/distribution/external_x64', 'R:/code/ryzom/client', '', '', '' ] WindowsExeDllCfgDirectories = [ '', 'R:/build/fv_x64/bin/Release', 'R:/distribution/external_x64', 'R:/code/ryzom/client', '', '', '' ]
try: try:
if args.preset: if not args.preset:
DummyUnknownName LinuxServiceExecutableDirectory
LinuxServiceExecutableDirectory
except NameError: except NameError:
LinuxServiceExecutableDirectory = "R:/build/gcc_server/bin" LinuxServiceExecutableDirectory = "R:/build/gcc_server/bin"
try: try:
if args.preset: if not args.preset:
DummyUnknownName LinuxClientExecutableDirectory
LinuxClientExecutableDirectory
except NameError: except NameError:
LinuxClientExecutableDirectory = "R:/build/gcc_client/bin" LinuxClientExecutableDirectory = "R:/build/gcc_client/bin"
try: try:
if args.preset: if not args.preset:
DummyUnknownName PatchmanCfgAdminDirectory
PatchmanCfgAdminDirectory
except NameError: except NameError:
PatchmanCfgAdminDirectory = "R:/patchman/admin_install" PatchmanCfgAdminDirectory = "R:/patchman/admin_install"
try: try:
if args.preset: if not args.preset:
DummyUnknownName PatchmanCfgDefaultDirectory
PatchmanCfgDefaultDirectory
except NameError: except NameError:
PatchmanCfgDefaultDirectory = "R:/patchman/default" PatchmanCfgDefaultDirectory = "R:/patchman/default"
try: try:
if args.preset: if not args.preset:
DummyUnknownName PatchmanBridgeServerDirectory
PatchmanBridgeServerDirectory
except NameError: except NameError:
PatchmanBridgeServerDirectory = "R:/pipeline/bridge_server" PatchmanBridgeServerDirectory = "R:/pipeline/bridge_server"
try: try:
@ -332,11 +276,9 @@ if not args.noconf:
ExportBuildDirectory = askVar(log, "[OUT] Export Build Directory", ExportBuildDirectory).replace("\\", "/") ExportBuildDirectory = askVar(log, "[OUT] Export Build Directory", ExportBuildDirectory).replace("\\", "/")
InstallDirectory = askVar(log, "[OUT] Install Directory", InstallDirectory).replace("\\", "/") InstallDirectory = askVar(log, "[OUT] Install Directory", InstallDirectory).replace("\\", "/")
ClientDevDirectory = askVar(log, "[OUT] Client Dev Directory", ClientDevDirectory).replace("\\", "/") ClientDevDirectory = askVar(log, "[OUT] Client Dev Directory", ClientDevDirectory).replace("\\", "/")
ClientDevLiveDirectory = askVar(log, "[OUT] Client Dev Live Directory", ClientDevLiveDirectory).replace("\\", "/")
ClientPatchDirectory = askVar(log, "[OUT] Client Patch Directory", ClientPatchDirectory).replace("\\", "/") ClientPatchDirectory = askVar(log, "[OUT] Client Patch Directory", ClientPatchDirectory).replace("\\", "/")
ClientInstallDirectory = askVar(log, "[OUT] Client Install Directory", ClientInstallDirectory).replace("\\", "/") ClientInstallDirectory = askVar(log, "[OUT] Client Install Directory", ClientInstallDirectory).replace("\\", "/")
ShardInstallDirectory = askVar(log, "[OUT] Shard Data Install Directory", ShardInstallDirectory).replace("\\", "/") ShardInstallDirectory = askVar(log, "[OUT] Shard Data Install Directory", ShardInstallDirectory).replace("\\", "/")
ShardDevDirectory = askVar(log, "[OUT] Shard Dev Directory", ShardDevDirectory).replace("\\", "/")
WorldEditInstallDirectory = askVar(log, "[OUT] World Edit Data Install Directory", WorldEditInstallDirectory).replace("\\", "/") WorldEditInstallDirectory = askVar(log, "[OUT] World Edit Data Install Directory", WorldEditInstallDirectory).replace("\\", "/")
LeveldesignDirectory = askVar(log, "[IN] Leveldesign Directory", LeveldesignDirectory).replace("\\", "/") LeveldesignDirectory = askVar(log, "[IN] Leveldesign Directory", LeveldesignDirectory).replace("\\", "/")
LeveldesignDfnDirectory = askVar(log, "[IN] Leveldesign DFN Directory", LeveldesignDfnDirectory).replace("\\", "/") LeveldesignDfnDirectory = askVar(log, "[IN] Leveldesign DFN Directory", LeveldesignDfnDirectory).replace("\\", "/")
@ -408,9 +350,6 @@ if not args.noconf:
sf.write("# Quality option for this site (1 for BEST, 0 for DRAFT)\n") sf.write("# Quality option for this site (1 for BEST, 0 for DRAFT)\n")
sf.write("BuildQuality = " + str(BuildQuality) + "\n") sf.write("BuildQuality = " + str(BuildQuality) + "\n")
sf.write("\n") sf.write("\n")
sf.write("RemapLocalFrom = \"" + str(RemapLocalFrom) + "\"\n")
sf.write("RemapLocalTo = \"" + str(RemapLocalTo) + "\"\n")
sf.write("\n")
sf.write("ToolDirectories = " + str(ToolDirectories) + "\n") sf.write("ToolDirectories = " + str(ToolDirectories) + "\n")
sf.write("ToolSuffix = \"" + str(ToolSuffix) + "\"\n") sf.write("ToolSuffix = \"" + str(ToolSuffix) + "\"\n")
sf.write("\n") sf.write("\n")
@ -427,11 +366,9 @@ if not args.noconf:
sf.write("# Install directories\n") sf.write("# Install directories\n")
sf.write("InstallDirectory = \"" + str(InstallDirectory) + "\"\n") sf.write("InstallDirectory = \"" + str(InstallDirectory) + "\"\n")
sf.write("ClientDevDirectory = \"" + str(ClientDevDirectory) + "\"\n") sf.write("ClientDevDirectory = \"" + str(ClientDevDirectory) + "\"\n")
sf.write("ClientDevLiveDirectory = \"" + str(ClientDevLiveDirectory) + "\"\n")
sf.write("ClientPatchDirectory = \"" + str(ClientPatchDirectory) + "\"\n") sf.write("ClientPatchDirectory = \"" + str(ClientPatchDirectory) + "\"\n")
sf.write("ClientInstallDirectory = \"" + str(ClientInstallDirectory) + "\"\n") sf.write("ClientInstallDirectory = \"" + str(ClientInstallDirectory) + "\"\n")
sf.write("ShardInstallDirectory = \"" + str(ShardInstallDirectory) + "\"\n") sf.write("ShardInstallDirectory = \"" + str(ShardInstallDirectory) + "\"\n")
sf.write("ShardDevDirectory = \"" + str(ShardDevDirectory) + "\"\n")
sf.write("WorldEditInstallDirectory = \"" + str(WorldEditInstallDirectory) + "\"\n") sf.write("WorldEditInstallDirectory = \"" + str(WorldEditInstallDirectory) + "\"\n")
sf.write("\n") sf.write("\n")
sf.write("# Utility directories\n") sf.write("# Utility directories\n")
@ -470,17 +407,7 @@ if not args.noconf:
sf.write("\n") sf.write("\n")
sf.write("\n") sf.write("\n")
sf.write("# end of file\n") sf.write("# end of file\n")
sf.flush()
sf.close() sf.close()
sf = open("configuration/buildsite_local.py", "w")
sfr = open("configuration/buildsite.py", "r")
for l in sfr:
sf.write(l.replace(RemapLocalFrom + '/', RemapLocalTo + '/'))
sf.flush()
sfr.close()
sf.close()
from buildsite_local import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
@ -521,7 +448,6 @@ printLog(log, "")
# Additional directories # Additional directories
printLog(log, ">>> Setup additional directories <<<") printLog(log, ">>> Setup additional directories <<<")
mkPath(log, ClientDevDirectory) mkPath(log, ClientDevDirectory)
mkPath(log, ClientDevLiveDirectory)
mkPath(log, ClientPatchDirectory) mkPath(log, ClientPatchDirectory)
mkPath(log, ClientInstallDirectory) mkPath(log, ClientInstallDirectory)

@ -1,94 +1,94 @@
#!/usr/bin/python #!/usr/bin/python
# #
# \file 1_export.py # \file 1_export.py
# \brief Run all export processes # \brief Run all export processes
# \date 2009-02-18 09:22GMT # \date 2009-02-18 09:22GMT
# \author Jan Boon (Kaetemi) # \author Jan Boon (Kaetemi)
# Python port of game data build pipeline. # Python port of game data build pipeline.
# Run all export processes # Run all export processes
# #
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors # Copyright (C) 2009-2014 by authors
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the # published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. # License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util, argparse import time, sys, os, shutil, subprocess, distutils.dir_util, argparse
sys.path.append("configuration") sys.path.append("configuration")
parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Export') parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Export')
# parser.add_argument('--haltonerror', '-eh', action='store_true') # parser.add_argument('--haltonerror', '-eh', action='store_true')
parser.add_argument('--includeproject', '-ipj', nargs='+') parser.add_argument('--includeproject', '-ipj', nargs='+')
parser.add_argument('--excludeproject', '-epj', nargs='+') parser.add_argument('--excludeproject', '-epj', nargs='+')
parser.add_argument('--includeprocess', '-ipc', nargs='+') parser.add_argument('--includeprocess', '-ipc', nargs='+')
parser.add_argument('--excludeprocess', '-epc', nargs='+') parser.add_argument('--excludeprocess', '-epc', nargs='+')
args = parser.parse_args() args = parser.parse_args()
if not args.includeproject == None and not args.excludeproject == None: if not args.includeproject == None and not args.excludeproject == None:
print "ERROR --includeproject cannot be combined with --excludeproject, exit." print "ERROR --includeproject cannot be combined with --excludeproject, exit."
exit() exit()
if not args.includeprocess == None and not args.excludeprocess == None: if not args.includeprocess == None and not args.excludeprocess == None:
print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." print "ERROR --includeprocess cannot be combined with --excludeprocess, exit."
exit() exit()
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
# Log error # Log error
printLog(log, "") printLog(log, "")
printLog(log, "-------") printLog(log, "-------")
printLog(log, "--- Run the export processes") printLog(log, "--- Run the export processes")
printLog(log, "-------") printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
# For each project # For each project
for projectName in ProjectsToProcess: for projectName in ProjectsToProcess:
if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)):
printLog(log, "PROJECT " + projectName) printLog(log, "PROJECT " + projectName)
os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName))
os.chdir("processes") os.chdir("processes")
try: try:
if not args.includeprocess == None: if not args.includeprocess == None:
subprocess.call([ "python", "1_export.py", "--includeprocess" ] + args.includeprocess) subprocess.call([ "python", "1_export.py", "--includeprocess" ] + args.includeprocess)
elif not args.excludeprocess == None: elif not args.excludeprocess == None:
subprocess.call([ "python", "1_export.py", "--excludeprocess" ] + args.excludeprocess) subprocess.call([ "python", "1_export.py", "--excludeprocess" ] + args.excludeprocess)
else: else:
subprocess.call([ "python", "1_export.py" ]) subprocess.call([ "python", "1_export.py" ])
except Exception, e: except Exception, e:
printLog(log, "<" + projectName + "> " + str(e)) printLog(log, "<" + projectName + "> " + str(e))
os.chdir("..") os.chdir("..")
try: try:
projectLog = open("processes/log.log", "r") projectLog = open("processes/log.log", "r")
projectLogData = projectLog.read() projectLogData = projectLog.read()
projectLog.close() projectLog.close()
log.write(projectLogData) log.write(projectLogData)
except Exception, e: except Exception, e:
printLog(log, "<" + projectName + "> " + str(e)) printLog(log, "<" + projectName + "> " + str(e))
else: else:
printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "IGNORE PROJECT " + projectName)
printLog(log, "") printLog(log, "")
log.close() log.close()
if os.path.isfile("1_export.log"): if os.path.isfile("1_export.log"):
os.remove("1_export.log") os.remove("1_export.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_export.log") shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_export.log")
shutil.move("log.log", "1_export.log") shutil.move("log.log", "1_export.log")

@ -1,94 +1,94 @@
#!/usr/bin/python #!/usr/bin/python
# #
# \file 2_build.py # \file 2_build.py
# \brief Run all build processes # \brief Run all build processes
# \date 2009-02-18 09:22GMT # \date 2009-02-18 09:22GMT
# \author Jan Boon (Kaetemi) # \author Jan Boon (Kaetemi)
# Python port of game data build pipeline. # Python port of game data build pipeline.
# Run all build processes # Run all build processes
# #
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors # Copyright (C) 2009-2014 by authors
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the # published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. # License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util, argparse import time, sys, os, shutil, subprocess, distutils.dir_util, argparse
sys.path.append("configuration") sys.path.append("configuration")
parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Build') parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Build')
# parser.add_argument('--haltonerror', '-eh', action='store_true') # parser.add_argument('--haltonerror', '-eh', action='store_true')
parser.add_argument('--includeproject', '-ipj', nargs='+') parser.add_argument('--includeproject', '-ipj', nargs='+')
parser.add_argument('--excludeproject', '-epj', nargs='+') parser.add_argument('--excludeproject', '-epj', nargs='+')
parser.add_argument('--includeprocess', '-ipc', nargs='+') parser.add_argument('--includeprocess', '-ipc', nargs='+')
parser.add_argument('--excludeprocess', '-epc', nargs='+') parser.add_argument('--excludeprocess', '-epc', nargs='+')
args = parser.parse_args() args = parser.parse_args()
if not args.includeproject == None and not args.excludeproject == None: if not args.includeproject == None and not args.excludeproject == None:
print "ERROR --includeproject cannot be combined with --excludeproject, exit." print "ERROR --includeproject cannot be combined with --excludeproject, exit."
exit() exit()
if not args.includeprocess == None and not args.excludeprocess == None: if not args.includeprocess == None and not args.excludeprocess == None:
print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." print "ERROR --includeprocess cannot be combined with --excludeprocess, exit."
exit() exit()
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
# Log error # Log error
printLog(log, "") printLog(log, "")
printLog(log, "-------") printLog(log, "-------")
printLog(log, "--- Run the build processes") printLog(log, "--- Run the build processes")
printLog(log, "-------") printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
# For each project # For each project
for projectName in ProjectsToProcess: for projectName in ProjectsToProcess:
if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)):
printLog(log, "PROJECT " + projectName) printLog(log, "PROJECT " + projectName)
os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName))
os.chdir("processes") os.chdir("processes")
try: try:
if not args.includeprocess == None: if not args.includeprocess == None:
subprocess.call([ "python", "2_build.py", "--includeprocess" ] + args.includeprocess) subprocess.call([ "python", "2_build.py", "--includeprocess" ] + args.includeprocess)
elif not args.excludeprocess == None: elif not args.excludeprocess == None:
subprocess.call([ "python", "2_build.py", "--excludeprocess" ] + args.excludeprocess) subprocess.call([ "python", "2_build.py", "--excludeprocess" ] + args.excludeprocess)
else: else:
subprocess.call([ "python", "2_build.py" ]) subprocess.call([ "python", "2_build.py" ])
except Exception, e: except Exception, e:
printLog(log, "<" + projectName + "> " + str(e)) printLog(log, "<" + projectName + "> " + str(e))
os.chdir("..") os.chdir("..")
try: try:
projectLog = open("processes/log.log", "r") projectLog = open("processes/log.log", "r")
projectLogData = projectLog.read() projectLogData = projectLog.read()
projectLog.close() projectLog.close()
log.write(projectLogData) log.write(projectLogData)
except Exception, e: except Exception, e:
printLog(log, "<" + projectName + "> " + str(e)) printLog(log, "<" + projectName + "> " + str(e))
else: else:
printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "IGNORE PROJECT " + projectName)
printLog(log, "") printLog(log, "")
log.close() log.close()
if os.path.isfile("2_build.log"): if os.path.isfile("2_build.log"):
os.remove("2_build.log") os.remove("2_build.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_build.log") shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_build.log")
shutil.move("log.log", "2_build.log") shutil.move("log.log", "2_build.log")

@ -1,94 +1,94 @@
#!/usr/bin/python #!/usr/bin/python
# #
# \file 3_install.py # \file 3_install.py
# \brief Run all install processes # \brief Run all install processes
# \date 2009-02-18 16:19GMT # \date 2009-02-18 16:19GMT
# \author Jan Boon (Kaetemi) # \author Jan Boon (Kaetemi)
# Python port of game data build pipeline. # Python port of game data build pipeline.
# Run all install processes # Run all install processes
# #
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors # Copyright (C) 2009-2014 by authors
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the # published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. # License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util, argparse import time, sys, os, shutil, subprocess, distutils.dir_util, argparse
sys.path.append("configuration") sys.path.append("configuration")
parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Install') parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Install')
# parser.add_argument('--haltonerror', '-eh', action='store_true') # parser.add_argument('--haltonerror', '-eh', action='store_true')
parser.add_argument('--includeproject', '-ipj', nargs='+') parser.add_argument('--includeproject', '-ipj', nargs='+')
parser.add_argument('--excludeproject', '-epj', nargs='+') parser.add_argument('--excludeproject', '-epj', nargs='+')
parser.add_argument('--includeprocess', '-ipc', nargs='+') parser.add_argument('--includeprocess', '-ipc', nargs='+')
parser.add_argument('--excludeprocess', '-epc', nargs='+') parser.add_argument('--excludeprocess', '-epc', nargs='+')
args = parser.parse_args() args = parser.parse_args()
if not args.includeproject == None and not args.excludeproject == None: if not args.includeproject == None and not args.excludeproject == None:
print "ERROR --includeproject cannot be combined with --excludeproject, exit." print "ERROR --includeproject cannot be combined with --excludeproject, exit."
exit() exit()
if not args.includeprocess == None and not args.excludeprocess == None: if not args.includeprocess == None and not args.excludeprocess == None:
print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." print "ERROR --includeprocess cannot be combined with --excludeprocess, exit."
exit() exit()
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
# Log error # Log error
printLog(log, "") printLog(log, "")
printLog(log, "-------") printLog(log, "-------")
printLog(log, "--- Run the install processes") printLog(log, "--- Run the install processes")
printLog(log, "-------") printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
# For each project # For each project
for projectName in ProjectsToProcess: for projectName in ProjectsToProcess:
if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)):
printLog(log, "PROJECT " + projectName) printLog(log, "PROJECT " + projectName)
os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName))
os.chdir("processes") os.chdir("processes")
try: try:
if not args.includeprocess == None: if not args.includeprocess == None:
subprocess.call([ "python", "3_install.py", "--includeprocess" ] + args.includeprocess) subprocess.call([ "python", "3_install.py", "--includeprocess" ] + args.includeprocess)
elif not args.excludeprocess == None: elif not args.excludeprocess == None:
subprocess.call([ "python", "3_install.py", "--excludeprocess" ] + args.excludeprocess) subprocess.call([ "python", "3_install.py", "--excludeprocess" ] + args.excludeprocess)
else: else:
subprocess.call([ "python", "3_install.py" ]) subprocess.call([ "python", "3_install.py" ])
except Exception, e: except Exception, e:
printLog(log, "<" + projectName + "> " + str(e)) printLog(log, "<" + projectName + "> " + str(e))
os.chdir("..") os.chdir("..")
try: try:
projectLog = open("processes/log.log", "r") projectLog = open("processes/log.log", "r")
projectLogData = projectLog.read() projectLogData = projectLog.read()
projectLog.close() projectLog.close()
log.write(projectLogData) log.write(projectLogData)
except Exception, e: except Exception, e:
printLog(log, "<" + projectName + "> " + str(e)) printLog(log, "<" + projectName + "> " + str(e))
else: else:
printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "IGNORE PROJECT " + projectName)
printLog(log, "") printLog(log, "")
log.close() log.close()
if os.path.isfile("3_install.log"): if os.path.isfile("3_install.log"):
os.remove("3_install.log") os.remove("3_install.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_install.log") shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_install.log")
shutil.move("log.log", "3_install.log") shutil.move("log.log", "3_install.log")

@ -1,181 +1,181 @@
#!/usr/bin/python #!/usr/bin/python
# #
# \file 9_upload.py # \file 9_upload.py
# \brief Upload data to servers # \brief Upload data to servers
# \date 2009-02-18 16:19GMT # \date 2009-02-18 16:19GMT
# \author Jan Boon (Kaetemi) # \author Jan Boon (Kaetemi)
# Game data build pipeline. # Game data build pipeline.
# Upload data to servers # Upload data to servers
# #
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2011 Kaetemi # Copyright (C) 2011 Kaetemi
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the # published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. # License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("configuration") sys.path.append("configuration")
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite_local import *
from tools import * from tools import *
try: try:
from upload import * from upload import *
except ImportError: except ImportError:
# Not documenting this. Because we can. # Not documenting this. Because we can.
printLog(log, "ERROR Upload not configured, bye.") printLog(log, "ERROR Upload not configured, bye.")
exit() exit()
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
# Log error # Log error
printLog(log, "") printLog(log, "")
printLog(log, "-------") printLog(log, "-------")
printLog(log, "--- Upload data to servers") printLog(log, "--- Upload data to servers")
printLog(log, "-------") printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
# Find tools # Find tools
# Not documenting this. Because we can. # Not documenting this. Because we can.
Psftp = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, UploadPsftpTool) Psftp = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, UploadPsftpTool)
printLog(log, "PSFTP " + Psftp) printLog(log, "PSFTP " + Psftp)
def downloadVersionTag(server, user, sshkey, dir): def downloadVersionTag(server, user, sshkey, dir):
if os.path.isfile("upload.tag"): if os.path.isfile("upload.tag"):
os.remove("upload.tag") os.remove("upload.tag")
if os.path.isfile("upload.batch"): if os.path.isfile("upload.batch"):
os.remove("upload.batch") os.remove("upload.batch")
ub = open("upload.batch", "w") ub = open("upload.batch", "w")
ub.write("cd " + dir + "\n") ub.write("cd " + dir + "\n")
ub.write("get upload.tag upload.tag\n") ub.write("get upload.tag upload.tag\n")
ub.write("quit\n") ub.write("quit\n")
ub.close() ub.close()
subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ]) subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ])
os.remove("upload.batch") os.remove("upload.batch")
if os.path.isfile("upload.tag"): if os.path.isfile("upload.tag"):
ft = open("upload.tag") ft = open("upload.tag")
result = float(ft.read()) # float, really result = float(ft.read()) # float, really
ft.close() ft.close()
os.remove("upload.tag") os.remove("upload.tag")
printLog(log, "INFO Upload tag is " + str(result)) printLog(log, "INFO Upload tag is " + str(result))
return result return result
else: else:
printLog(log, "WARNING Upload tag not found, uploading everything") printLog(log, "WARNING Upload tag not found, uploading everything")
return 0 return 0
def isDirectoryNeeded(ft, dir): def isDirectoryNeeded(ft, dir):
files = os.listdir(dir) files = os.listdir(dir)
for fileName in files: for fileName in files:
if isLegalFileName(fileName): if isLegalFileName(fileName):
fileFull = dir + "/" + fileName fileFull = dir + "/" + fileName
if os.path.isfile(fileFull): if os.path.isfile(fileFull):
nftf = os.stat(fileFull).st_mtime nftf = os.stat(fileFull).st_mtime
if nftf > ft: if nftf > ft:
return True return True
elif os.path.isdir(fileFull): elif os.path.isdir(fileFull):
if isDirectoryNeeded(ft, fileFull): if isDirectoryNeeded(ft, fileFull):
return True return True
elif not os.path.isdir(fileFull): elif not os.path.isdir(fileFull):
printLog(log, "isDirectoryNeeded: file not dir or file?!" + fileFull) printLog(log, "isDirectoryNeeded: file not dir or file?!" + fileFull)
return False return False
def listDirectoryUpload(ft, ub, udb, dir): def listDirectoryUpload(ft, ub, udb, dir):
nft = 0 nft = 0
files = os.listdir(dir) files = os.listdir(dir)
for fileName in files: for fileName in files:
if isLegalFileName(fileName): if isLegalFileName(fileName):
fileFull = dir + "/" + fileName fileFull = dir + "/" + fileName
if os.path.isfile(fileFull): if os.path.isfile(fileFull):
nftf = os.stat(fileFull).st_mtime nftf = os.stat(fileFull).st_mtime
if nftf > ft: if nftf > ft:
ub.write("put " + fileFull + " " + fileName + "\n") ub.write("put " + fileFull + " " + fileName + "\n")
if nftf > nft: if nftf > nft:
nft = nftf nft = nftf
elif os.path.isdir(fileFull): elif os.path.isdir(fileFull):
if isDirectoryNeeded(ft, fileFull): if isDirectoryNeeded(ft, fileFull):
udb.write("mkdir " + fileName + "\n") udb.write("mkdir " + fileName + "\n")
ub.write("cd " + fileName + "\n") ub.write("cd " + fileName + "\n")
udb.write("cd " + fileName + "\n") udb.write("cd " + fileName + "\n")
nft2 = listDirectoryUpload(ft, ub, udb, fileFull) nft2 = listDirectoryUpload(ft, ub, udb, fileFull)
if (nft2 > nft): if (nft2 > nft):
nft = nft2 nft = nft2
ub.write("cd ..\n") ub.write("cd ..\n")
udb.write("cd ..\n") udb.write("cd ..\n")
elif not os.path.isdir(fileFull): elif not os.path.isdir(fileFull):
printLog(log, "listDirectoryUpload: file not dir or file?!" + fileFull) printLog(log, "listDirectoryUpload: file not dir or file?!" + fileFull)
return nft return nft
def uploadSftp(server, user, sshkey, dir_to, dir_from, addcmd): def uploadSftp(server, user, sshkey, dir_to, dir_from, addcmd):
ft = downloadVersionTag(server, user, sshkey, dir_to) ft = downloadVersionTag(server, user, sshkey, dir_to)
if isDirectoryNeeded(ft, dir_from): if isDirectoryNeeded(ft, dir_from):
if os.path.isfile("upload_dir.batch"): if os.path.isfile("upload_dir.batch"):
os.remove("upload_dir.batch") os.remove("upload_dir.batch")
if os.path.isfile("upload.batch"): if os.path.isfile("upload.batch"):
os.remove("upload.batch") os.remove("upload.batch")
udb = open("upload_dir.batch", "w") udb = open("upload_dir.batch", "w")
udb.write("cd " + dir_to + "\n") udb.write("cd " + dir_to + "\n")
ub = open("upload.batch", "w") ub = open("upload.batch", "w")
ub.write("cd " + dir_to + "\n") ub.write("cd " + dir_to + "\n")
for ac in addcmd: for ac in addcmd:
ub.write(ac + "\n") ub.write(ac + "\n")
ftn = listDirectoryUpload(ft, ub, udb, dir_from) ftn = listDirectoryUpload(ft, ub, udb, dir_from)
if (ft > ftn): if (ft > ftn):
ftn = ft ftn = ft
nft = open("upload.tag", "w") nft = open("upload.tag", "w")
nft.write(str(ftn)) nft.write(str(ftn))
nft.close() nft.close()
ub.write("put upload.tag upload.tag\n") ub.write("put upload.tag upload.tag\n")
ub.write("quit\n") ub.write("quit\n")
ub.close() ub.close()
udb.write("quit\n") udb.write("quit\n")
udb.close() udb.close()
subprocess.call([ Psftp, "-be", "-b", "upload_dir.batch", "-i", sshkey, user + "@" + server ]) subprocess.call([ Psftp, "-be", "-b", "upload_dir.batch", "-i", sshkey, user + "@" + server ])
subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ]) subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ])
os.remove("upload_dir.batch") os.remove("upload_dir.batch")
os.remove("upload.batch") os.remove("upload.batch")
os.remove("upload.tag") os.remove("upload.tag")
else: else:
printLog(log, "SKIP " + dir_to) printLog(log, "SKIP " + dir_to)
printLog(log, ">>> Upload patch <<<") printLog(log, ">>> Upload patch <<<")
for target in UploadPatch: for target in UploadPatch:
uploadSftp(target[0], target[1], target[2], target[3], ClientPatchDirectory + "/patch", [ ]) uploadSftp(target[0], target[1], target[2], target[3], ClientPatchDirectory + "/patch", [ ])
printLog(log, ">>> Upload data_shard <<<") printLog(log, ">>> Upload data_shard <<<")
for target in UploadShard: for target in UploadShard:
uploadSftp(target[0], target[1], target[2], target[3], DataShardDirectory, [ "rm *.packed_sheets", "rm primitive_cache/*.binprim" ]) uploadSftp(target[0], target[1], target[2], target[3], DataShardDirectory, [ "rm *.packed_sheets", "rm primitive_cache/*.binprim" ])
printLog(log, ">>> Upload data_common <<<") printLog(log, ">>> Upload data_common <<<")
for target in UploadCommon: for target in UploadCommon:
uploadSftp(target[0], target[1], target[2], target[3], DataCommonDirectory, [ ]) uploadSftp(target[0], target[1], target[2], target[3], DataCommonDirectory, [ ])
printLog(log, ">>> Upload data_leveldesign/leveldesign <<<") printLog(log, ">>> Upload data_leveldesign/leveldesign <<<")
for target in UploadLeveldesign: for target in UploadLeveldesign:
uploadSftp(target[0], target[1], target[2], target[3], LeveldesignDirectory, [ ]) uploadSftp(target[0], target[1], target[2], target[3], LeveldesignDirectory, [ ])
printLog(log, ">>> Upload data_leveldesign/primitives <<<") printLog(log, ">>> Upload data_leveldesign/primitives <<<")
for target in UploadPrimitives: for target in UploadPrimitives:
uploadSftp(target[0], target[1], target[2], target[3], PrimitivesDirectory, [ ]) uploadSftp(target[0], target[1], target[2], target[3], PrimitivesDirectory, [ ])
log.close() log.close()
if os.path.isfile("9_upload.log"): if os.path.isfile("9_upload.log"):
os.remove("9_upload.log") os.remove("9_upload.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_upload.log") shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_upload.log")
shutil.move("log.log", "9_upload.log") shutil.move("log.log", "9_upload.log")

@ -1,74 +1,74 @@
#!/usr/bin/python #!/usr/bin/python
# #
# \file a1_worldedit_data.py # \file a1_worldedit_data.py
# \brief Install worldedit data # \brief Install worldedit data
# \date 2014-09-10 14:01GMT # \date 2014-09-10 14:01GMT
# \author Jan Boon (Kaetemi) # \author Jan Boon (Kaetemi)
# Python port of game data build pipeline. # Python port of game data build pipeline.
# Install worldedit data # Install worldedit data
# #
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2014 by authors # Copyright (C) 2014 by authors
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the # published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. # License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("configuration") sys.path.append("configuration")
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
# Log error # Log error
printLog(log, "") printLog(log, "")
printLog(log, "-------") printLog(log, "-------")
printLog(log, "--- Install worldedit data") printLog(log, "--- Install worldedit data")
printLog(log, "-------") printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
for ecosystem in WorldEditEcosystems: for ecosystem in WorldEditEcosystems:
ecosystemName = ecosystem[0] ecosystemName = ecosystem[0]
srcZoneLigos = ExportBuildDirectory + "/ecosystems/" + ecosystemName + "/ligo_es/zoneligos/" srcZoneLigos = ExportBuildDirectory + "/ecosystems/" + ecosystemName + "/ligo_es/zoneligos/"
dstZoneLigos = WorldEditInstallDirectory + "/" + ecosystemName + "/zoneligos/" dstZoneLigos = WorldEditInstallDirectory + "/" + ecosystemName + "/zoneligos/"
mkPath(log, srcZoneLigos) mkPath(log, srcZoneLigos)
mkPath(log, dstZoneLigos) mkPath(log, dstZoneLigos)
copyFilesNoTreeIfNeeded(log, srcZoneLigos, dstZoneLigos) copyFilesNoTreeIfNeeded(log, srcZoneLigos, dstZoneLigos)
srcZoneBitmaps = DatabaseDirectory + "/landscape/ligo/" + ecosystemName + "/zonebitmaps/" srcZoneBitmaps = DatabaseDirectory + "/landscape/ligo/" + ecosystemName + "/zonebitmaps/"
dstZoneBitmaps = WorldEditInstallDirectory + "/" + ecosystemName + "/zonebitmaps/" dstZoneBitmaps = WorldEditInstallDirectory + "/" + ecosystemName + "/zonebitmaps/"
mkPath(log, srcZoneBitmaps) mkPath(log, srcZoneBitmaps)
mkPath(log, dstZoneBitmaps) mkPath(log, dstZoneBitmaps)
copyFilesExtNoTreeIfNeeded(log, srcZoneBitmaps, dstZoneBitmaps, ".tga") copyFilesExtNoTreeIfNeeded(log, srcZoneBitmaps, dstZoneBitmaps, ".tga")
copyFilesExtNoTreeIfNeeded(log, srcZoneBitmaps, dstZoneBitmaps, ".png") copyFilesExtNoTreeIfNeeded(log, srcZoneBitmaps, dstZoneBitmaps, ".png")
dstCollisionMap = WorldEditInstallDirectory + "/" + ecosystemName + "/collisionmap/" dstCollisionMap = WorldEditInstallDirectory + "/" + ecosystemName + "/collisionmap/"
mkPath(log, dstCollisionMap) mkPath(log, dstCollisionMap)
for continentName in ecosystem[1]: for continentName in ecosystem[1]:
srcCollisionMap = ExportBuildDirectory + "/continents/" + continentName + "/ai_wmap/" srcCollisionMap = ExportBuildDirectory + "/continents/" + continentName + "/ai_wmap/"
mkPath(log, srcCollisionMap) mkPath(log, srcCollisionMap)
copyFilesExtNoTreeIfNeeded(log, srcCollisionMap, dstCollisionMap, ".tga") copyFilesExtNoTreeIfNeeded(log, srcCollisionMap, dstCollisionMap, ".tga")
copyFilesExtNoTreeIfNeeded(log, srcCollisionMap, dstCollisionMap, ".png") copyFilesExtNoTreeIfNeeded(log, srcCollisionMap, dstCollisionMap, ".png")
printLog(log, "") printLog(log, "")
log.close() log.close()
if os.path.isfile("a1_worldedit_data.log"): if os.path.isfile("a1_worldedit_data.log"):
os.remove("a1_worldedit_data.log") os.remove("a1_worldedit_data.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_worldedit_data.log") shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_worldedit_data.log")
shutil.move("log.log", "a1_worldedit_data.log") shutil.move("log.log", "a1_worldedit_data.log")

@ -24,14 +24,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util, socket import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("configuration") sys.path.append("configuration")
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
@ -45,10 +45,9 @@ printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
mkPath(log, ClientDevLiveDirectory) if not os.path.isfile(ClientDevDirectory + "/client.cfg"):
if not os.path.isfile(ClientDevLiveDirectory + "/client.cfg"): printLog(log, ">>> Generate client.cfg <<<")
printLog(log, ">>> Generate live dev client.cfg <<<") cfg = open(ClientDevDirectory + "/client.cfg", "w")
cfg = open(ClientDevLiveDirectory + "/client.cfg", "w")
cfg.write("RootConfigFilename = \"client_default.cfg\";\n") cfg.write("RootConfigFilename = \"client_default.cfg\";\n")
cfg.write("PreDataPath = {\n") cfg.write("PreDataPath = {\n")
cfg.write("\t\"user\", \"patch\", \"" + DataCommonDirectory + "\", \"" + GamedevDirectory + "\", \"" + LeveldesignDirectory + "/translation/translated\", \"" + InstallDirectory + "\", \"data\", \"examples\" \n") cfg.write("\t\"user\", \"patch\", \"" + DataCommonDirectory + "\", \"" + GamedevDirectory + "\", \"" + LeveldesignDirectory + "/translation/translated\", \"" + InstallDirectory + "\", \"data\", \"examples\" \n")
@ -58,24 +57,6 @@ if not os.path.isfile(ClientDevLiveDirectory + "/client.cfg"):
cfg.write("DisplayLuaDebugInfo = 1;\n") cfg.write("DisplayLuaDebugInfo = 1;\n")
cfg.write("AllowDebugLua = 1;\n") cfg.write("AllowDebugLua = 1;\n")
cfg.write("FullScreen = 0;\n") cfg.write("FullScreen = 0;\n")
cfg.flush()
cfg.close()
printLog(log, "")
mkPath(log, ClientDevDirectory)
if not os.path.isfile(ClientDevDirectory + "/client.cfg"):
printLog(log, ">>> Generate local dev client.cfg <<<")
cfg = open(ClientDevDirectory + "/client.cfg", "w")
cfgr = open(ClientDevLiveDirectory + "/client.cfg", "r")
for l in cfgr:
cfg.write(l)
cfgr.close()
cfg.write("StartupHost = \"http://" + socket.gethostname() + ":9042\";\n")
cfg.write("Application = {\n")
cfg.write(" \"dev\", \"./client_ryzom_r.exe\", \"./\" \n")
cfg.write("};\n")
cfg.flush()
cfg.close()
printLog(log, "") printLog(log, "")
printLog(log, ">>> Install data <<<") printLog(log, ">>> Install data <<<")
@ -83,17 +64,13 @@ for category in InstallClientData:
if (category["UnpackTo"] != None): if (category["UnpackTo"] != None):
printLog(log, "CATEGORY " + category["Name"]) printLog(log, "CATEGORY " + category["Name"])
targetPath = ClientDevDirectory targetPath = ClientDevDirectory
targetPathLive = ClientDevLiveDirectory
if (category["UnpackTo"] != ""): if (category["UnpackTo"] != ""):
targetPath += "/" + category["UnpackTo"] targetPath += "/" + category["UnpackTo"]
targetPathLive += "/" + category["UnpackTo"]
mkPath(log, targetPath) mkPath(log, targetPath)
mkPath(log, targetPathLive)
for package in category["Packages"]: for package in category["Packages"]:
printLog(log, "PACKAGE " + package[0]) printLog(log, "PACKAGE " + package[0])
mkPath(log, InstallDirectory + "/" + package[0]) mkPath(log, InstallDirectory + "/" + package[0])
copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPath) copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPath)
copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPathLive)
printLog(log, "") printLog(log, "")
log.close() log.close()

@ -1,93 +1,93 @@
#!/usr/bin/python #!/usr/bin/python
# #
# \file b2_shard_data.py # \file b2_shard_data.py
# \brief Install shard data # \brief Install shard data
# \date 2009-02-18 16:19GMT # \date 2009-02-18 16:19GMT
# \author Jan Boon (Kaetemi) # \author Jan Boon (Kaetemi)
# Python port of game data build pipeline. # Python port of game data build pipeline.
# Install shard data # Install shard data
# #
# NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> # NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
# Copyright (C) 2009-2014 by authors # Copyright (C) 2009-2014 by authors
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as # it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the # published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. # License, or (at your option) any later version.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU Affero General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
import time, sys, os, shutil, subprocess, distutils.dir_util import time, sys, os, shutil, subprocess, distutils.dir_util
sys.path.append("configuration") sys.path.append("configuration")
if os.path.isfile("log.log"): if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite_local import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)
from projects import * from projects import *
# Log error # Log error
printLog(log, "") printLog(log, "")
printLog(log, "-------") printLog(log, "-------")
printLog(log, "--- Install shard data") printLog(log, "--- Install shard data")
printLog(log, "-------") printLog(log, "-------")
printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
printLog(log, "") printLog(log, "")
for dir in InstallShardDataDirectories: for dir in InstallShardDataDirectories:
printLog(log, "SHARD PACKAGE " + dir) printLog(log, "SHARD PACKAGE " + dir)
mkPath(log, ShardInstallDirectory + "/" + dir) mkPath(log, ShardInstallDirectory + "/" + dir)
printLog(log, "FROM " + dir) printLog(log, "FROM " + dir)
mkPath(log, InstallDirectory + "/" + dir) mkPath(log, InstallDirectory + "/" + dir)
copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + dir, ShardInstallDirectory + "/" + dir) copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + dir, ShardInstallDirectory + "/" + dir)
for package in InstallShardDataFiles: for package in InstallShardDataFiles:
dstDir = package[0] dstDir = package[0]
mkPath(log, ShardInstallDirectory + "/" + dstDir) mkPath(log, ShardInstallDirectory + "/" + dstDir)
printLog(log, "SHARD PACKAGE " + dstDir) printLog(log, "SHARD PACKAGE " + dstDir)
copyFileListNoTreeIfNeeded(log, InstallDirectory, ShardInstallDirectory + "/" + dstDir, package[1]) copyFileListNoTreeIfNeeded(log, InstallDirectory, ShardInstallDirectory + "/" + dstDir, package[1])
for multiDir in InstallShardDataMultiDirectories: for multiDir in InstallShardDataMultiDirectories:
dstDir = multiDir[0] dstDir = multiDir[0]
mkPath(log, ShardInstallDirectory + "/" + dstDir) mkPath(log, ShardInstallDirectory + "/" + dstDir)
printLog(log, "SHARD PACKAGE " + dstDir) printLog(log, "SHARD PACKAGE " + dstDir)
for srcDir in multiDir[1]: for srcDir in multiDir[1]:
printLog(log, "FROM " + srcDir) printLog(log, "FROM " + srcDir)
mkPath(log, InstallDirectory + "/" + srcDir) mkPath(log, InstallDirectory + "/" + srcDir)
mkPath(log, ShardInstallDirectory + "/" + dstDir + "/" + srcDir) mkPath(log, ShardInstallDirectory + "/" + dstDir + "/" + srcDir)
copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + srcDir, ShardInstallDirectory + "/" + dstDir + "/" + srcDir) copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + srcDir, ShardInstallDirectory + "/" + dstDir + "/" + srcDir)
for multiDir in InstallShardDataPrimitivesDirectories: for multiDir in InstallShardDataPrimitivesDirectories:
dstDir = multiDir[0] dstDir = multiDir[0]
mkPath(log, ShardInstallDirectory + "/" + dstDir) mkPath(log, ShardInstallDirectory + "/" + dstDir)
printLog(log, "SHARD PACKAGE " + dstDir) printLog(log, "SHARD PACKAGE " + dstDir)
for srcDir in multiDir[1]: for srcDir in multiDir[1]:
printLog(log, "FROM PRIMITIVES " + srcDir) printLog(log, "FROM PRIMITIVES " + srcDir)
mkPath(log, PrimitivesDirectory + "/" + srcDir) mkPath(log, PrimitivesDirectory + "/" + srcDir)
mkPath(log, ShardInstallDirectory + "/" + dstDir + "/" + srcDir) mkPath(log, ShardInstallDirectory + "/" + dstDir + "/" + srcDir)
copyFilesNoTreeIfNeeded(log, PrimitivesDirectory + "/" + srcDir, ShardInstallDirectory + "/" + dstDir + "/" + srcDir) copyFilesNoTreeIfNeeded(log, PrimitivesDirectory + "/" + srcDir, ShardInstallDirectory + "/" + dstDir + "/" + srcDir)
for execDir in InstallShardDataExecutables: for execDir in InstallShardDataExecutables:
dstDir = execDir[0] dstDir = execDir[0]
mkPath(log, LinuxServiceExecutableDirectory) mkPath(log, LinuxServiceExecutableDirectory)
mkPath(log, PatchmanCfgDefaultDirectory) mkPath(log, PatchmanCfgDefaultDirectory)
mkPath(log, InstallDirectory) mkPath(log, InstallDirectory)
mkPath(log, ShardInstallDirectory + "/" + dstDir) mkPath(log, ShardInstallDirectory + "/" + dstDir)
printLog(log, "SHARD PACKAGE " + dstDir) printLog(log, "SHARD PACKAGE " + dstDir)
copyFileIfNeeded(log, LinuxServiceExecutableDirectory + "/" + execDir[1][1], ShardInstallDirectory + "/" + dstDir + "/" + execDir[1][0]) copyFileIfNeeded(log, LinuxServiceExecutableDirectory + "/" + execDir[1][1], ShardInstallDirectory + "/" + dstDir + "/" + execDir[1][0])
copyFileListNoTreeIfNeeded(log, PatchmanCfgDefaultDirectory, ShardInstallDirectory + "/" + dstDir, execDir[2]) copyFileListNoTreeIfNeeded(log, PatchmanCfgDefaultDirectory, ShardInstallDirectory + "/" + dstDir, execDir[2])
copyFileListNoTreeIfNeeded(log, InstallDirectory, ShardInstallDirectory + "/" + dstDir, execDir[3]) copyFileListNoTreeIfNeeded(log, InstallDirectory, ShardInstallDirectory + "/" + dstDir, execDir[3])
printLog(log, "") printLog(log, "")
log.close() log.close()
if os.path.isfile("b2_shard_data.log"): if os.path.isfile("b2_shard_data.log"):
os.remove("b2_shard_data.log") os.remove("b2_shard_data.log")
shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_shard_data.log") shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_shard_data.log")
shutil.move("log.log", "b2_shard_data.log") shutil.move("log.log", "b2_shard_data.log")

@ -35,7 +35,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

@ -35,7 +35,7 @@ if os.path.isfile("log.log"):
os.remove("log.log") os.remove("log.log")
log = open("log.log", "w") log = open("log.log", "w")
from scripts import * from scripts import *
from buildsite_local import * from buildsite import *
from tools import * from tools import *
sys.path.append(WorkspaceDirectory) sys.path.append(WorkspaceDirectory)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save