author | Wuzzy |
Sun, 27 Nov 2016 04:37:17 +0000 | |
changeset 940 | 8c4a529edddb |
parent 749 | db0eeafa0cdf |
child 1422 | a6f2064e67a5 |
permissions | -rw-r--r-- |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
1 |
#summary Importing an SVG into Hedgewars |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
2 |
|
749 | 3 |
= Importing from SVG files = |
4 |
== Introduction == |
|
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
5 |
|
376
c840baf439ec
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
375
diff
changeset
|
6 |
This is a quick and dirty description of converting an SVG into hedgewars HWMAP format. It is not at all pretty. Hopefully someone will make a prettier process. It currently makes use of Inkscape, vim, perl, g++ and a bit of manual labour. It looks best in 0.9.18+ which makes use of the variable brush size (the examples below use the second smallest size, 16px wide) |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
7 |
|
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
8 |
|
749 | 9 |
== Details == |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
10 |
|
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
11 |
Open Inkscape. |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
12 |
Go to File->Inkscape Preferences and make sure that |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
13 |
* SVG Output->Allow relative coordinates is unchecked |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
14 |
* Transforms->Store transformation is set to Optimized |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
15 |
|
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
16 |
Open an SVG. Ideally one of simple line art, without too much use of fill or filters. |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
17 |
|
231
b5780c560285
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
230
diff
changeset
|
18 |
1) Select all in the image and choose ungroup, then combine all paths in the drawing (select them, then choose Path->Combine). |
334
612048d0890b
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
331
diff
changeset
|
19 |
Note. I had some difficulty doing that with some images even after repeated use of ungroup. I ended up just going into the SVG file and deleting all the groups. This usually happens if there are filters in place. Removing all the g tags but keeping the paths inside the groups in the SVG in a text editor might be faster than cleaning up in Inkscape. |
234
88f4f75b381c
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
233
diff
changeset
|
20 |
Also, some paths might be worth eliminating altogether. In order to get a better idea of what it'll look like, try: View->Display Mode->Outline. To simulate occluding, you can try combining individual paths first, and using union to combine into larger groups. This takes a bit more work. If it still doesn't look right, you're going to have to go in and delete nodes, and generally rework the shape to simulate occlusion. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
21 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
22 |
2) Go to File->Document Properties and specify 4096 for W and 2048 for H. You may want to then reposition the art to be more centred vertically or horizontally. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
23 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
24 |
3) Click on the path, and choose dimensions for W and H that would look good in the game (no more than 4096 for W and 2048 for H). The Lock button may be helpful here. Generally resize it and reposition it using the document white area as a guide to how it will look on the in-game drawing area, then save and quit. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
25 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
26 |
4) Open in a text editor and verify there is one path. Change sodipodi:namedview's ID attribute to id="base" - this is to work around a bug in the current stable Inkscape (0.48.3.1) extensions tool which was crashing it. This is probably fixed in 0.48.4. Note that I haven't tested this workaround. su_v says this is the correct way to do it because apparently id="base" is a reserved name for namedview in sodipodi - which seems like a rather common and collision-likely name. I had misread him and changed the path's id to base, and that seemed to work fine. If changing namedview doesn't work, try renaming the path instead. |
236
51ce3b455ad7
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
235
diff
changeset
|
27 |
Make sure all those groups are removed. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
28 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
29 |
5) Open the file in Inkscape again, Click on the path again, then go to Extensions->Modify Path->Flatten Beziers and flatten out the curves to your taste. Default of 10 seems fine most of the time, but for small curved objects you might want something like 5. Keep in mind, the more the approximation, the more points that Hedgewars has to draw, which can be rough on the engine and network communication, then save and quit. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
30 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
31 |
6) Edit the file, and delete everything but the path data. You should have a one-line file starting with something like M1234.3 456.78L3298.3 9023.34 and so on. |
240
85ea0e6d423d
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
239
diff
changeset
|
32 |
If instead you have a format like M 1234.678,9875.323 2345.0,123.45 - you'll want to convert if you want to try the crude script in (10) - otherwise a smarter script would be needed. Here's some Vim commands for that syntax {{{s/\(\d\) \(\d\)/\1 L\2/g}}} and {{{s/,/ /g}}} and {{{s/\([LM]\)\s*/\1/g}}} |
238
d7b867f80284
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
237
diff
changeset
|
33 |
|
334
612048d0890b
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
331
diff
changeset
|
34 |
The coordinates should now be rounded for use by the crude script in (10) unless you plan to handle that yourself in some way. Here is a vim one-liner to do it. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
35 |
{{{:s/[0-9][0-9.]*/\=float2nr(floor(submatch(0)*1))/g}}} |
238
d7b867f80284
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
237
diff
changeset
|
36 |
|
375
b1b18eeea04e
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
374
diff
changeset
|
37 |
Also, it is probably a good idea to remove duplicate points. Here's a regex for that. {{{s/\(L\d\+ \d\+ \)\1/\1/g}}} - you should run that a couple of times, then {{{s/M\(\d\+ \d\+ \)L\1/M\1/g}}}. That just cuts down on a bit of redundancy. If these regexes match anything, you probably should rerun them. |
b1b18eeea04e
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
374
diff
changeset
|
38 |
Since this page is a mass of hacks, here's one more redundancy reducer, in bash this time. |
b1b18eeea04e
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
374
diff
changeset
|
39 |
{{{rm dupes.txt;PREVXY=(99999 99999);sed 's/\([LM]\)/\n\1/g' inputfile | while read f;do read -a XY <<< "${f:1}";if [ "${f:0:1}" != "M" ];then if((${XY[0]}-${PREVXY[0]}<3&&${XY[0]}-${PREVXY[0]}>-3&&${XY[1]}-${PREVXY[1]}<3&&${XY[1]}-${PREVXY[1]}>-3));then echo "$f" >> dupes.txt;else echo $f;fi;else echo $f;fi;PREVXY[0]=${XY[0]};PREVXY[1]=${XY[1]};done | xargs > inputfile.dedupe}}} |
b1b18eeea04e
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
374
diff
changeset
|
40 |
If dupes.txt has anything in it, you probably should run it again. Anyway, running these reduced a complex test trace from ~8800 points down to ~6500. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
41 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
42 |
7) Convert the path data. Here is a crude script to do that. Note this one uses a line size of 1 (that's the 0x01 business). |
363
c6e60247e9d4
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
334
diff
changeset
|
43 |
If you want larger lines you can pick anything between 0x00 and 0x3F. That's 6-636. See the [DrawnMapFormat] wiki page. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
44 |
{{{ |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
45 |
#!/usr/bin/perl |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
46 |
# just a one-line list of points. at least, it had better be one-line |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
47 |
open FILE, $ARGV[0]; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
48 |
while(<FILE>) |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
49 |
{ |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
50 |
chomp; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
51 |
s/([LM])(\d+) (\d+)\s*/point($1,$2,$3)/eg; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
52 |
print; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
53 |
} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
54 |
sub point |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
55 |
{ |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
56 |
($t, $x, $y) = @_; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
57 |
$x+=0; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
58 |
$y+=0; # just in case |
239
91b2ea70aff4
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
238
diff
changeset
|
59 |
printf("%c%c%c%c%c",$x>>8,$x&0xff,$y>>8,$y&0xff,($t=~m/M/)?(0x80|0x01):0x00); |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
60 |
return; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
61 |
} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
62 |
}}} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
63 |
{{{script pointdata > hwpointdata}}} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
64 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
65 |
8) qCompress the data. |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
66 |
{{{g++ -I /usr/include/qt4 -I /usr/include/qt4/QtCore qcompress.cpp -lQtCore}}} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
67 |
{{{ |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
68 |
#include <QFile> |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
69 |
#include <QByteArray> |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
70 |
using namespace std; |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
71 |
int main(int argc, char **argv) |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
72 |
{ |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
73 |
QFile fromFile(argv[1]); |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
74 |
QFile toFile(argv[2]); |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
75 |
if(fromFile.open(QIODevice::ReadOnly) && toFile.open(QIODevice::WriteOnly)) |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
76 |
{ |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
77 |
toFile.write(qCompress(fromFile.readAll())); |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
78 |
} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
79 |
} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
80 |
}}} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
81 |
{{{./a.out hwpointdata hwpointdata.Z}}} |
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
82 |
|
385
6f4ad8faeaff
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
376
diff
changeset
|
83 |
9) Convert to base64 and you're done! (whew) |
227
c7897b5d10c5
Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff
changeset
|
84 |
|
228
13f07e078365
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
227
diff
changeset
|
85 |
{{{base64 -w0 hwpointdata.Z > mynewhedgewars.hwmap}}} |
13f07e078365
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
227
diff
changeset
|
86 |
|
13f07e078365
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
227
diff
changeset
|
87 |
Enjoy. |
13f07e078365
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
227
diff
changeset
|
88 |
|
331 | 89 |
Here are some example hwmap files from the process above. They look better in 0.9.18+ due to the added size support, allowing thinner lines. |
228
13f07e078365
Edited wiki page SVGImport through web user interface.
kyberneticist@gmail.com
parents:
227
diff
changeset
|
90 |
http://m8y.org/hw/drawn/ |