def convert(p):
        dct = {
                'sheet': p.sheet_idx,
                # Give the offset of the pixel corresponding to (0,0,0)
                'offset': geom.sub(p.offset, p.base),
                'vert_idx': p.vert_idx,
                'vert_count': p.vert_count,
                }

        flags = p.get_flags()
        if flags != 0:
            dct.update(
                flags=flags)

        if isinstance(p.img, image2.Anim):
            dct.update(
                anim_length=p.img.length,
                anim_rate=p.img.rate,
                anim_oneshot=p.img.oneshot,
                anim_size=p.img.px_size)

        return dct
    def __init__(self, name, image, model, shape, layer):
        super(StructureDef, self).__init__(name, shape, layer)
        px_size = tuple(x * TILE_SIZE for x in shape.size)
        mesh = model.to_mesh()

        if isinstance(image, StaticAnimDef):
            base = image2.Image(img=image_cache.ConstImage(image.static_base))
            base_model2 = Model2(mesh, ((0, 0, 0), px_size))
            self.add_part(base_model2, base)

            frame_sheet = image2.Image(img=image_cache.ConstImage(image.anim_sheet),
                    unit=image.anim_size)
            frames = [frame_sheet.extract((x, 0)) for x in range(image.length)]
            anim = image2.Anim(frames, image.framerate, image.oneshot)
            box_min = geom.sub(image.anim_offset, (0, shape.size[2] * TILE_SIZE))
            box_max = geom.add(box_min, image.anim_size)
            anim_mesh = mesh.copy()
            geom.clip_xv(anim_mesh, *(box_min + box_max))
            anim_model2 = Model2(anim_mesh, anim_mesh.get_bounds())
            self.add_part(anim_model2, anim)
        else:
            image = image2.Image(img=image_cache.ConstImage(image))
            model2 = Model2(mesh, ((0, 0, 0), px_size))
            self.add_part(model2, image)