Having made by now a full graphics generator that produces everything, from textures to meshes and full animations too1, I can also finally get out of the existing swamp of data somethings and provide instead a clear list of types, formats and files that are actually quite enough for client's needs. Basically there are only 3 big types, each requiring a bunch of specific files:
- Outdoors type (or "sector", "area", "zone", "world", whatever you want to call it, the point is that it has some solid terrain, some sort of "water" in the lower parts and some sort of "sky" that should arguably be in the upper parts only but is in practice all-surrounding). This is the most involved type as it requires three parts, each with its own bunch of specific files2:
- Non-moving type, aka CS mesh, requiring the following files:
- meshfactory.csmesh9
- tex.png
- Moving type, aka Cal3d, requiring the following files:
- skeleton.csf (or .xsf)
- any number of .caf (or .xaf) files - the animations. Those may have in principle names matching the "type of animation" they are meant for but note that on one hand CS/Cal3d has a limited and fixed number of such "types" (specifically: idle, travel, cycle, style_cycle and action) and on the other hand it's not all that clear what's the point of them since the more important part is otherwise setting for each some use parameters, of which the most important are the speed interval for which that animation is relevant (hence, when it will be used) and whether to lock in the final pose or not.
- any number of .cmf (or .xmf) files - the meshes making up this model and including the texture mapping. Note that different models have different number of meshes and there is no specific order in which the meshes are numbered either. As a pattern at the moment I'm simply using mesh_id.xmf as name for the file and loading until no file found.
- tex.png (or .dds) - the texture to use for ALL meshes; alternatively, any number of tex_id.png so that each mesh has its own texture, supposing that this might be useful at some point.
In addition to the above, there are a few more formats that are simply one file each, used as such: icons (simply a .png or .dds file), sounds (.ogg or .wav) and perhaps particle systems that will need a SMG format since there is no file/format for them at all, only all sorts of code-side settings of this and that. Currently and as per previous discussion, the sounds are not going to be supported but I mention here for completeness the formats known to work with CS.
All image files may in principle be either .png or .dds, with the .dds format the preferable one (takes less space and requires less computations client-side). This being said though, the client should work with either/both and there is only a reasonable requirement that the size be a power of 2. Current textures are all 512x512 pixels and any change to this needs to be matched with a change to the texture mappings provided for each mesh and so on - in other words, I think the correct approach here is simply to bundle together as above the mesh definition with the texture it is meant to use and don't even bother otherwise to explicitly provide whatever number of different sizes - the size of an image is anyway included in the file so whoever is interested to extract it may do so directly from there.
The above description of types and formats marks a fundamental shift in approach and since this cleared up for me only gradually as a result of all the work sunk into the graphics and client side since the beginning of this year, I'd rather set it out explicitly here. The old client's approach focused on loading everything upfront and keeping it all in memory, based on the assumption that there are somehow great gains to this by means of extensive reuse of assets once loaded. In practice I fail to see those gains but there is otherwise ample cost clearly visible and always paid upfront10: fixed and difficult to expand set of assets, long - and moreover, getting longer ie *worse* with any extension of the assets!- initial loading time for the client as a whole, significant overhead required to support the reuse fantasy because otherwise there's precious little reuse when it comes to meshes and characters and even textures. Basically the old idea is of having a central catalogue of all graphics assets and then referencing those from everywhere else. By contrast, my current approach has no such central catalogue and relies instead on each element that requires some graphics assets to know where to find them and possibly have them in its own directory. Essentially, the current approach considers disk space cheap (though NOT network communications - note that assets may end up duplicated locally but in principle they don't *have to* be also sent 1000 times over the wire; it can very well be perhaps the job of the data acquisition module to duplicate files if/when needed and/or set them or link them where expected), discards the reuse pretense and relies instead on minimal overhead as well as minimal, on-demand loading (potentially coupled at implementation time with aggressive clear up of unused resources if memory gets clogged otherwise).
While the above is not yet set in stone, it might very well soon become set, so let me know if you see any trouble with it or if there's some better way to go about it that I just don't see yet.
For the curious, *all* this stands currently at 5581 lines of code+comments+tests+png writer + convenience scripts. No, I did *not* forget any 0 at the end and no, it doesn't require external libs, platforms whatever-else, it's standalone, C, gawk and bash code only. ↩
The .dds format is in principle better but in practice all image files may end up either .dds or .png so the client side will have to make do with what is provided, perhaps run its own conversions if it has to. ↩
Also known as alpha map, if that helps you any. ↩
These are the materials that get used/applied depending on the height and on the basemap - while logically speaking I would just say any number of materials should work, in practice the existing terrain plugin wants exactly and precisely 3, not more nor less. This being said, the format from my point of view will be tex_number files and load as many or as few as your client can use. ↩
Those are normals for the corresponding texture and in principle they are optional though the terrain will likely look worse without them. ↩
The current implementation does require a bunch of other settings such as reflection coefficient and whatnot but I think that's strictly a client-side concern so entirely locally-set, nothing to do with getting it from the server. ↩
This is a texture to be reflected by the water and it's optional. Currently this is the sky's image. ↩
Note that the current implementation does require all sorts of other "options", from picking the geometry of the sky (!) to a whole bunch of shader variables. Nevertheless, I don't see why would any of that be a concern outside of each client - so they'll be set locally, change your client as you want it if you are fed up with the sphere-sky or something. ↩
XML file in CS "meshfact" format, which can be loaded directly with CS's loader and then instantiated as and when desired. It contains the following information: position of all vertices, normals of the surface at each vertex, texture coordinates at each vertex, triangles making up the surface. These are effectively listed as such, since this is what CS expects. Note that the format forces the mesh to include a fixed texture mapping, but any texture can be used at load time - how well it will fit or not the mapping is a different matter. ↩
Come to think of it, this does strike me now as very much the typical problem: paying upfront a significant price for.... not missing an opportunity that never materializes though, huh. ↩
Comments feed: RSS 2.0
In addition to the above: while currently the client does not perform any check /doesn't have any expected hashes on any of the files it loads, on one hand those are meant to be files obtained via the smg comms that basically includes checks already and on the other hand I'm not sure what would yet another check add to it otherwise, though it's certainly possible to add such additional check, sure, at the expense of some more calculations and passing around of keccak hashes or whatever is used.
Honestly just the hash should be perfectly fine.
Ok, adding file hashes and checks to the list of requirements then.
One irksome point is that indeed we might want multi-sized textures -- such as to accommodate better and worse graphics processors it is common practice to give the user the choice whether to run with double, normal or half-sized textures (or 4x, x, 1/4x depending on the GB count of the game directory). I don't particularly want anything done about this right now, but I can't promise a fixed-size-match forever either.
Noted and in the big scheme of things I doubt it creates any big trouble really since the moment I find a working way to deal properly with all the rest, this sort of thing can be in or out without making a significant difference.
Word.
Meant to add here, since you mentioned accommodating various graphical capabilities - the same thing would normally go for all the graphics assets really i.e. not only textures but also meshes, cal3d models, animations, everything. For example, the Cal3d format even has in principle this "LOD" (level of detail) option that requires a full spec of what vertices get collapsed when working at lower LOD. As it may be quite obvious, so far I entirely sidestepped this issue, mainly because it really is non-essential in my opinion and it can otherwise easily eat up a lot of time. Nevertheless, since the size of the textures came into discussion, I think it's best said that presumably at some point we might indeed want to insert some new layers/levels for other graphical elements too. From what I can currently tell, I think that changes of this sort basically should be ok as long as they *add* to whatever it was and do *not* remove any of the existing things - sure, the old clients will not know what to do with the new things but they should not choke on them either (and I'm currently working with this idea in mind on all parts really, e.g. the data acquisition should not choke on such stuff either, just ignore it and move on).
I don't think "collapsing vertices" is either sane or useful. If we do that, we'll just have whole models for each resolution and that's that.
Otherwise yes, your outlook is healthy.
Really glad to hear this!
Version: GnuPG v1.4.10 (GNU/Linux)
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
j/w=
=4PtD
-----END PGP MESSAGE-----
hQIMA3U2qif5BrDFAQ//bw8z6cNO+vsg5TYO+34H/EjwMzsYE5S24MgyEqGeNeVR
WMbk+ptNZJ2/5Pdsgi3XAkkPmWxR64rTzQrr9oJtYsHY8yHjgN/ldnzPDgF0GpqO
bhxCC+6eXSnmdHyhAkQVbx+E+miqMz9HhyLn2gxWVW38VymuOWvD7t3RhRe6aj+G
qNvu48PXF4IEmSBB7xjDpp04FflO94/TWCl4ZxwXowyWni4EC3AeBYLU+Q6PkuHV
gOwueQkGRRErOmKeaiyS4d+2+baO2HmOu2LNRUxCLICXJlSJ88v2HTAvmBpNE706
3QggjEY1fnyrTEY0yh7LK4HaJjA+7sZIz3KbsjUeNKGicLP+Sz/FfdwZX2DMX53p
CL9JnUoZcvxEeK3wVZvFDA3315ZTQ9y17pWaCNeGIfriOaxarLwSMHAAQBcyXogl
TlDKWNYRgBlPWT5q2Z7+OGnO0tPJFyqoX0HieBrMzE2E5Uz50vzYsCRn/NFDntLn
0qEHXzQj8JUqd33NXmeqzPJdCo5G91P42+/YHsiCoLNEIaFOmUGCmGjtxlQrfNkc
6zWuBGNM+KCXa/I0EiaH6Zy545CnB6tZSUbJFsQ94/etmT1afJq1S4XM5aupa2OQ
+YSLuVDwlUkAcZ0Bm568nG9HOjYKCDU6+kYhlFO285RiKVINeDyjifZN9HAsBhSF
AgwD0e/1VD4jchEBD/4oMz+6kKDz+ZAkSmL9oPF2w+gzsrr3mkNBNUJO4KN9w+JY
HtueJyoC8/WHMs9OPs00zeuaq43xHNYIi3/pA5MRVykf5UZdgVpWz0GxYowq9xxA
wi7LOd+QCGGjzT3H8pd+qoPDjZEVREcFMeVH0efBIqF23x5MYuL0pqolppjCW+US
ryOtBhUjiqOOqAuTLWq4o6fQY24K5bu1OewdjHCevwaIh2l31rfdc9moUeuzvcHj
P/mRRKj/xhy0SOvw5u6g92ejHXJ+crO31vvrUOWaMGBbSiagDSnTYiAODTHUZORz
eiZlBlrJCyD0GN0MCjj9SqBa9lji/xPzyCfNIvrB3KY2r3G1I/H5ehMAatHR3qnf
moPTBmJT9XkceEqp8wQXy7//E9QWKtiSw39X3BKT4taWUWhFyy5JlQsREtOVUtRZ
27b9rMAHv27EHPtwjvPdOZydD/SRSIFLBRStYtgbSdc6fy2PrSNJSazLduufNSaK
0cj6Vg/1i+EBfa0M5N68VBZeP5RjAnaJEDhoM24metrxXDZSBDU5U3igGbGRw065
2AtzUoffyCteOyYFXZMbPezwgJ8WAMuco4CTcch8A/SfzGFZX7Mfh4QacotOBmY9
hNT3pxQJTba6lGKBOvXu3/azi81vQ9ZgCqggGFv/q5JMsLw5hwN9ywYIQwJhjoUC
DAPG2c7OFrjjLgEQAJNHPAfPrZ9+U/0QuOAK6J+XK+V++vizlHFxmH8nnOydtXPf
820VdVto5wd40ad9fX4FiIFlKmOYvYKJqiPzMVdO7HbY501PPBrvony3Z3aoH2mY
nhLWF3J8bBZ0slyCO6e7DyFy7kcWfa7YCF4wSm91bWtrqry++j1nRisuQO4HICTJ
g6Qjl45o7swT57sADEgd+YBYIjZCeQ81K68XW8tUpbJL8EanBunAaaaXbtUBvvnZ
j0RW1SpkGomQvWc5wbS+n0HZ+azn4hMFyn7FPOvK6AokEu4Yjy2Fuwbi4l/4HKqM
dNsLQviT5KwJwVxi0UHoSKKv0C+AOpVlOZuC2kAeE0lKgfGZVANxnmi/UsqSCrC/
J6l8uFnH3oR16wMSksxLPVEmuxJP7fRKyKMDWylxYtuwVgEN1N/puWvI8TlI/mox
k5wf3VCCdyrSSSG6j/EAPjKo5kSvVRHKqMZwWgV29f3OHtuYlzijv7WqBoxA1fib
/SDOdz/kE0TgPpOCZQFVmeFN5IKnFUkS86Nhw/O/RRTlkJf0u9zVze8FG2ZLDZaQ
JTy5YGRDzXsnkokNW066jmvgGlX0hiBrEOMowB9xRfaxilTAt8RxoOyIqJ0FwZCO
K+fv377FM/NAzF9flnpN9FNzipICho3MduoKFn0AOLXxayHah39qSLXBxGXs0uwB
0o3LvvoMWLykNXMVcs3afhhAhOIs5lTjLEH+bKxcid2DLYni+xPeTdy9kzR1ZRq1
RzlBjNDQ1ZiNsdpCfdoKG8zPlUw7HLvtO7IsA/z5GjFiSwPixbiK8Bl2x649+laT
P8Sx/UZsplRcNv/9Gni91tx4TrFDlM/N/EjzKOJaRZq0pRiGGzHsJs3UvGx5gVDw
hFe5DH9l8W4Pp2kcCYkpnsveykScDI2ZxQouXdiIa/eI3KrGg+m/vOxQXYDaJn53
4V9wvVtanoU0N25j1a0+kI06pSFy42GhYiftawpAddrEvzbsE/tSC8erNlo89+6E
6rUzo0Ov8wsRDDrgT2xuRwhoILu6YQX5kSuWA5dYwt6A6cx73hXs+xMCUTLmYtaa
9JTo8wsrl9QtdMi36aISKylmdnmsQYyxJpXLHMWlc6eHqGx/abuYYQSPX7ZnvBFm
CXxwEGeENtFfqcbhXl+BxUPfXAsCcZPlpIl6dsIuqPFYQJOCimIg6E8hWHleodx9
9AmJzIqQq5kRUeHqzhR1tBqrjfoULv3t6sRDRRV07skB5EFZRJkk9oc6wlIvh/E8
HLyCWvqmxMc3QYJT4WRPt2FnhP+I2s3/gPyYUtHJf4CIIA5t40fJOdZ44YlBqkg0
KaGmX8WlOZo1ntkDghY725yL4ZaMELbPDes1qWc5AC3vl+c5JHmaLmQ83lToOgjE
ZMhdvnvaZWmJ6vbCFaZArdvdqw2n8vzi6uraHlzjcGPf7j337gkkRmKVNIUZ0JkC
OeoZ2d+zLAmdMJDG54qKDUgP50rybpQQ9BFz17WrqGkyqk9KazPSdOlemPUUlj1f
vAzVIgiU6p/G5+C8rHGfMPmMklARTStH4d/jSzc1SXyVsT5i+PU9CaAp+8rQ+NaC
8uFntOnOUWyH8zFs3xjrKiAQzB46BqyfakYJSEFsEQQ1cm/09CPg+VBWztGxu3tK
hDySBM3NyfqjD+18QvtL36nnGE93Ka8UJPnjvxlmyNOwzxip5/BCDubIXQBzniqN
gvXdfTu08Tm3SjGiD5iprSIQTOHcbHei5HNp+Fyo3fAkOMshWVifEZgP6rN0HryY
3RMPU8z01QL+q81owlGGdzwtC7eHVbaLJvNZp1tHndPmhzaKnp/vhPqxxaLgVKBZ
OZwTj6rhsmf49czusoYv8FV/tLlAyqbgaVTEZrn8tbqUMzqTMYgTqt1iAmagywkb
J23XJtK0RMrNObKzjm1fHSCLuu6PLTJkNOr7pZqvFqY77tb0kGe47lDUeScxI/38
acgu0NKZns44Cii5zSjVUbj5xh+4S7viTFlAF75/uN+YokQxsxQuBd+onUyG+Twc
9i4qo2IS0CodjRyxIMYBrTyGyUuVdA1NqLfXVz5qMCIzwwdrCjiDjru4pKPvUtJR
C6YvE8OomACYQMwOUPwSWlDrqSCK76PKnlVZ6e278V6d1YUtadT7bixhl04pFCIb
DjJm+gSwmym8NrZdVdgA3WFU+OlX3/takZDnqPa33pRG2YQpjdNPED3+oWjCIb4m
4qO4mFz/uvVcYwgGwfbrtID6tPROsSqeg5xa9NrbjFDBF7G+kybfMmBEM+nhK4iQ
+DzhN9jovLTQTzDKVI6puMRYKnQjTHESnRTmtXDiOLlEB1I3jhhP/RIpmhG/ZLYY
0N//ac8QTAqmWwJy50VhtXVysbcmiT/rWiSW52lnxkqfLEdr/Pha1dv9AIK2+qql
z7fuhWtgJWt/THLVx6RCh8exAPYkKAga4At4H7CEwRSBesAh8wuEXU6M8dwb9rfx
E6ihBZ9RaZIpNnG32zBkWVxgXmtCrUFj4ydyVyh7fzA1ZvbH6fgNtSeES8aYHokM
S2ZGEideCdfDftysCkaKB3b7jBBeCA3CS9GxrPgrsNqAq98Ma7wxUlCT4NQrbGpg
ngvEh0aofOumremZu4qV1npQyRuHUEBrXUKMHLECGyoAM8WGVImd00dXW+Fyr2EA
Yv99pJBzySmCIQlSewTNva141VO8IyQEazHVxhSdonkzY+7nKIJsczJs/rKRRI38
IG8YnuROkfrPQUEg1jD2g3UhNaPyq3gN0Gv9RuXmGnPrW7Pm1Zx0ZH/QYqpWy3Bn
vaKRvhqizusm6cQK/meAvVQsLhf9JuAnnQYMkoNQ9dQx3AwCLDfQ97RB2QFlF+Mu
nQjV1KtSupjNItRC6RQl6AUgj5guosUYTLyDCw/obiMxRZcHvcK0GAz6pBLTHat8
tt+VAYUB+de8OTlb2MJGvpXuW8UoFqGGfOTnlU3b32+vjIG6VU8gSAZeeZxC1+bg
TSOvhUl7+1RB91Eu/ZZAVqh60fzaFq+NqYDmCySebNA2Nf4FTR1YJiFNZcUA12c+
6BVc884Qegh8fwWiGeI9jMdN58EExlO5DMS8vzqPpDwlOGhFUkZheUPxi6gKJeSd
bpBixQ/qF5DgMQ/Dn+Ot8M/h9ob39yMvnOp3xooOS7HxRg/5mTnza025G5qDHjgS
PSE5wjzRQ3vqA4f6BHydev87X9zQZ/d/NngNytLKJ4tJhM3kAzmVO3+7Zz2sz4K0
xkl7rdolpbh7VczCHEZb44WgV75UrxLegJgurIa0vRDqAi/FVtNnZCuRvKi5x7hx
+MydIvTk3bqMbbLCDCVnnpfAKN/ir/i3oOEse0AHE+N8mjWGXAikLTJe6i0EmTyN
1BNCVM9Q/WI344qcTZXazQHqp7na0sw+gxJxLXMt8ei7mEgeOu5h3riPfNvQpR62
qfj9OrY5iGlj0THtxiAh8Od5HCqkhAMWM4MP2eSoUEcmgwB2xGT8doZBlIoPSu9S
gWD/wrvLNct2Y7vceHOKZ4jBM1vwYHaU6thJgndp7OERon2P/eH8ljJcFlddeFSR
3HIxVhbzGMW8/Vkd/GRwFCgjtQ/FBPhWWseRAbadnMGRk/rEhwDxCVh6cCrGod+W
AIn/juktXWT/AJZ4cTHk82rbFg96bUIN4/cid47gjYGCFr3YVuh3C4pj/gdaiBl8
tJ8bgv0LnG+6uqyAe/KDhVR63bI2QXEINMyRNTUL2cFxTR5WsuVxY7JBIko7lMNl
cUTmGDTCd5DqYQ5lmX9ZRNbpMStqECcndWA+iJHBN3P3XLL5gYwibhzR16X8An3J
u60l6JZgGahrdvZHE7R8X9zwhd50EdlfHZZDzGN+YIT4OH+VnrUI5Z62KxBKW5oA
6T9nAmn1b/dPgEXDVVZW17Q8vae7BUYPvBeWsH75wmKPiiAcNmoQ4wg9LwnKN1o4
Q6IfiPPY0g2QhsGj5RfsUk1XsZJp8OBTNFmXyXHG3AV4OrFp1F1CSXQqjNhAukfe
jyS9i+PuHU7vhZoAK0wGNMlLxs8xths+PJhvuoIf8L3OFuElVSi7wrQPp5KmAAKy
Lqsyi56JI+IvYXZMyuDBdzhJcSQnpCi01TuiDD+v8jwEpErg3jUhCAPu18dO6ToO
z2daLZWYti24Okq22MuUq033WAvKDp+9igVYum+w2ht51xE5IVKUdEDem9cUMsOO
T1/y3e8qfTg9eI0cCd9TKljvNbtmf9bEHhY3bs39QLnGRPCkMCf0Xv2Hd8wNRY3m
Ly5LNs4yeEFaZ8/nY2zGt3VzvEx703JaNHmt3oYqEq91o9j+IsPsgorD5YlC3dL4
AJu2Y7zkXyCKUZLDyU0JzqwqSBA3Mtae2R6xxaN3a3qeHxcEyI3ycEVQf7qzrk6E
Cy5HgM7vICSiPAirRHk+P07KNzcySx5hZj4/F50In3ngYcjrJCFar4F2jqn53kPX
/1q0jJCd6rWKLbKWVtDU/BYS7/PGR5wsO9qyV9Y7UVJu0Z3zP5JbikqxZVZC/8/b
VpKvbaG6GlmzCprc5Y+6g1E1ICQQu2jNWDQXf4QHpu+UjCVYTufZ930V9zC+qCl1
ZmWgRqyISuUARZMzy6rgp6voHg6xIb0G5vdgqwv35weNveTfNfwvgPda2TqVikNg
6l2N5dVueojlVLGodyQdj5Mh0MjXyjP7UGPgwze4f3z+tRsqGskuf2D6f7N8uJj7
5A/+pNO50WVJFEIBb5lzEhiC4jsX0D5spsRNgBxdRrSMn/9FKZYEqwBAqy0P5pm1
dZZQRPWyxMDOjUmtJT2tpCvlZOgyK5RlxmJLlj9+Yor2KM/jYd3VqtBXOfDX2bxC
atXN7Y+RBqCOyDT09WPGoS+To0+P54wCm3/+KJ5ieNHZFyEN0TnCssm3hTWqtuqI
sZ5Gpung80aITCUMH6FAHMcZVF4xw5ojFBQmJ3StJhblR6NIONzfjb6A8KMAZc/U
xSH0lQii2IsuwdrVO7+eDm4//qNRNZ+0i+MVbxADYhA+174mE/9w9CQGqf1d5WYp
RvpKSFV3Mn5Sp03HZUmmXegexQ97DVHMIctH7UJOvBfxptZKGFZgPsG5pcSRMUFO
fLW96k/iWPEr+3T74111NN/Rrw9agGpUXgfVRkEwaf36tN2uCKRZSNTeKhqHODo8
JRYICBBaUoEVsacT9jS2dqFTGK7p48k5Vmnxecv19cBTiaj12blJfjK/n6uy1Plg
rspyMHsBLdl8uTrK0+Vr088fbri13nCJaZbDvGU8UMkFvOai5d12LZBLgGdBd/hm
rAkiVfv0gcTL+HC/g0vwC3BMfLnVu54vRwkkCIzCIY7rUNPL1oJxsZeG7vUQRD36
8iRSnvq6yzQNZ1c5gbdeAoJAcyrvxZa6cHD5+EGUCjqfu05yiieN27/hfnS4bsGk
RVUZP+ubKZ78XnHkX1XzwKUYWXRti6QE+VTXVYGFCI4PjH92jGQDmUjWwFYiw+M4
93D1QykkRetMOToIYMtfuoH3gkI2mYlsZWKAQEhul60cn6Iijs58yp3QCsmeoFDB
nmWFx8oNMn4/VbrYRfkykdoWVv+9cVAz2CXyS7uS1j0pZXjoAH3zQl9aCm6VaUPn
cGoqcaKXSqJx1v6nE/v/JCqgRS1y0zDntMu5WTslV2wdMPe8TrcAPmoYE0HmqpmW
kb4mtdbDXDB+GA0QxPJ404tsvnXc7jYWkb4RoPcWPWBA9LYEkogtAk/FJ86hv+Q/
xqTHFJSqSNB1Wez1NDkGkW2RA8pq4nidl/Vtl3781quSJhY4H+vdBpqM0eP6xwTa
V2E0I2vF8pR8QmcU4pL0foqTQaWOEsDTpRuugMBBqpVlItnqhIKv5e3dZPAs/Cjg
ct2YXiL7FqdKsEJdCGhvgcP1AwTAloeR/3LS1voa7HnAD1t+gMGqPOyeLdtVai9I
cDS2Z97NAX+ewAy3ej5i01sQuI3HhM9LiryauV148ypLANpMXIsRWwgHH48zZXRe
hRAnuajw0rUxJxxMFfvRqBBg2gbWJVgjSqbtLll0WSsfNea/04W2YlkRfm15fdtf
Dc+ds+pjdxlUgyeV1d2Q/mwnEZYGzinfSCLtRRU0bcJaqSvVU6K3rVMMQqbuZB0m
Xzo/14b91T3b98tGn8L7XwlbTb5A44J4bN0j+FVYY7tFmNdsGYy5V0OhlaJLEx+D
xOXyhlNIfsjkZhuixq5hR6eZy9TtTMDY3/NV7mn/CND97m5IRh1DSS9avGjPMLkE
3NqdXcamDyB5nSf+mMQB
=JdSi
-----END PGP MESSAGE-----
[...] http://ossasepia.com/2020/06/22/eulora-client-graphics-main-types-and-formats/ << Ossa Sepia -- Eulora Client Graphics: Main Types and Formats [...]
[...] http://ossasepia.com/2020/06/22/eulora-client-graphics-main-types-and-formats/ << Ossa Sepia Eulora -- Eulora Client Graphics: Main Types and Formats [...]
[...] to the previous iteration, the "outdoors" type bundled together water, terrain and sky because in practical terms they always [...]