diff -r 6ca639109e95 -r c7897b5d10c5 SVGImport.wiki --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SVGImport.wiki Sun Jun 24 21:20:16 2012 +0000 @@ -0,0 +1,78 @@ +#summary Importing an SVG into Hedgewars + += Introduction = + +This is a quick and dirty description of converted 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. + + += Details = + +Open Inkscape. +Go to File->Inkscape Preferences and make sure that + * SVG Output->Allow relative coordinates is unchecked + * Transforms->Store transformation is set to Optimized + +Open an SVG. Ideally one of simple line art, without too much use of fill or filters. + +1) combine all paths in the drawing (select them, then choose Path->Combine) + +2) select the combined path, and ungroup + +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. + +4) Go to File->Document Properties and choose Resize Page to Drawing or Selection. You may want to then reposition the art to be more centred vertically or horizontally. + +5) Save and Quit + +6) Open in an editor and verify there is one path. change the path ID attribute to id="base" - this is to work around a bug in the current stable Inkscape extensions tool which was crashing it. + +7) 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. + +8) Save and Quit again + +9) 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. The coordinates should now be rounded unless you plan to handle that yourself in some way. Here is a vim one-liner to do it. +{{{:s/[0-9][0-9.]*/\=float2nr(floor(submatch(0)*1))/g}}} + +10) Convert the path data. Here is a crude script to do that. +{{{ +#!/usr/bin/perl +# just a one-line list of points. at least, it had better be one-line +open FILE, $ARGV[0]; +while() +{ + chomp; + s/([LM])(\d+) (\d+)\s*/point($1,$2,$3)/eg; + print; +} +sub point +{ + ($t, $x, $y) = @_; + $x+=0; + $y+=0; # just in case + printf("%c%c%c%c%c",$x>>8,$x&0xff,$y>>8,$y&0xff,($t=~m/M/)?0x81:0x01); + return; +} +}}} +{{{script pointdata > hwpointdata}}} + +11) qCompress the data. +{{{g++ -I /usr/include/qt4 -I /usr/include/qt4/QtCore qcompress.cpp -lQtCore}}} +{{{ +#include +#include +using namespace std; +int main(int argc, char **argv) +{ + QFile fromFile(argv[1]); + QFile toFile(argv[2]); + if(fromFile.open(QIODevice::ReadOnly) && toFile.open(QIODevice::WriteOnly)) + { + toFile.write(qCompress(fromFile.readAll())); + } +} +}}} +{{{./a.out hwpointdata hwpointdata.Z}}} + +12) Convert to base64 and you're done! + +{{{base64 -w0 hwpointdata.Z > mynewhedgewars.hwmap}}} \ No newline at end of file