SVGImport.wiki
author kyberneticist@gmail.com
Sun, 24 Jun 2012 21:20:16 +0000
changeset 227 c7897b5d10c5
child 228 13f07e078365
permissions -rw-r--r--
Created wiki page through web user interface.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
     3
= Introduction =
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
     4
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
     5
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.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
     6
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
= Details =
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
     9
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    10
Open Inkscape.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    11
Go to File->Inkscape Preferences and make sure that
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    12
    * SVG Output->Allow relative coordinates is unchecked
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    13
    * Transforms->Store transformation  is set to Optimized
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    14
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    15
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
    16
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    17
1) combine all paths in the drawing (select them, then choose Path->Combine)
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    18
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    19
2) select the combined path, and ungroup
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    20
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    21
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.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    22
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    23
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.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    24
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    25
5) Save and Quit
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    26
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    27
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.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    28
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    29
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.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    30
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    31
8) Save and Quit again
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    32
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    33
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.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    34
{{{:s/[0-9][0-9.]*/\=float2nr(floor(submatch(0)*1))/g}}}
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    35
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    36
10) Convert the path data.  Here is a crude script to do that.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    37
{{{
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    38
#!/usr/bin/perl
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    39
# 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
    40
open FILE, $ARGV[0];
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    41
while(<FILE>)
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    42
{
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    43
    chomp;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    44
    s/([LM])(\d+) (\d+)\s*/point($1,$2,$3)/eg;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    45
    print;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    46
} 
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    47
sub point
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    48
{
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    49
    ($t, $x, $y) = @_;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    50
    $x+=0;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    51
    $y+=0; # just in case
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    52
    printf("%c%c%c%c%c",$x>>8,$x&0xff,$y>>8,$y&0xff,($t=~m/M/)?0x81:0x01);
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    53
    return;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    54
}
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
{{{script pointdata > hwpointdata}}}
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    57
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    58
11) qCompress the data.
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    59
{{{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
    60
{{{
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    61
#include <QFile>
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    62
#include <QByteArray>
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    63
using namespace std;
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    64
int main(int argc, char **argv) 
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    65
{
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    66
    QFile fromFile(argv[1]);
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    67
    QFile toFile(argv[2]);
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    68
    if(fromFile.open(QIODevice::ReadOnly) && toFile.open(QIODevice::WriteOnly))
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    69
    {
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    70
        toFile.write(qCompress(fromFile.readAll()));
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    71
    }
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
}}}
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    74
{{{./a.out hwpointdata hwpointdata.Z}}}
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    75
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    76
12) Convert to base64 and you're done!
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    77
c7897b5d10c5 Created wiki page through web user interface.
kyberneticist@gmail.com
parents:
diff changeset
    78
{{{base64 -w0 hwpointdata.Z > mynewhedgewars.hwmap}}}