%module{Slic3r::XS};

%{
#include <myinit.h>
#include "Surface.hpp"
%}

%name{Slic3r::Surface} class Surface {
    ~Surface();
    ExPolygon* expolygon()
        %code{% const char* CLASS = "Slic3r::ExPolygon"; RETVAL = new ExPolygon(THIS->expolygon); %};
    double thickness()
        %code{% RETVAL = THIS->thickness; %};
    unsigned short thickness_layers()
        %code{% RETVAL = THIS->thickness_layers; %};
%{

Surface*
_new(CLASS, expolygon, surface_type, thickness, thickness_layers, bridge_angle, extra_perimeters)
    char*           CLASS;
    ExPolygon*      expolygon;
    SurfaceType     surface_type;
    double          thickness;
    unsigned short  thickness_layers;
    double          bridge_angle;
    unsigned short  extra_perimeters;
    CODE:
        RETVAL = new Surface ();
        RETVAL->expolygon           = *expolygon;
        RETVAL->surface_type        = surface_type;
        RETVAL->thickness           = thickness;
        RETVAL->thickness_layers    = thickness_layers;
        RETVAL->bridge_angle        = bridge_angle;
        RETVAL->extra_perimeters    = extra_perimeters;
        // we don't delete expolygon here because it's referenced by a Perl SV
        // whose DESTROY will take care of destruction
    OUTPUT:
        RETVAL

SurfaceType
Surface::surface_type(...)
    CODE:
        if (items > 1) {
            THIS->surface_type = (SurfaceType)SvUV(ST(1));
        }
        RETVAL = THIS->surface_type;
    OUTPUT:
        RETVAL

double
Surface::bridge_angle(...)
    CODE:
        if (items > 1) {
            THIS->bridge_angle = (double)SvNV(ST(1));
        }
        RETVAL = THIS->bridge_angle;
    OUTPUT:
        RETVAL

unsigned short
Surface::extra_perimeters(...)
    CODE:
        if (items > 1) {
            THIS->extra_perimeters = (double)SvUV(ST(1));
        }
        RETVAL = THIS->extra_perimeters;
    OUTPUT:
        RETVAL

%}
};

%package{Slic3r::Surface};
%{

IV
_constant()
  ALIAS:
    S_TYPE_TOP              = stTop
    S_TYPE_BOTTOM           = stBottom
    S_TYPE_INTERNAL         = stInternal
    S_TYPE_INTERNALSOLID    = stInternalSolid
    S_TYPE_INTERNALBRIDGE   = stInternalBridge
    S_TYPE_INTERNALVOID     = stInternalVoid
  PROTOTYPE:
  CODE:
    RETVAL = ix;
  OUTPUT: RETVAL

%}