/*
* This file is part of N-point image deformation library.
*
* N-point image deformation library is free software: you can
* redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by
* the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* N-point image deformation library is distributed in the hope
* that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with N-point image deformation library.
* If not, see .
*
* Copyright (C) 2013 Marek Dvoroznak
*/
#ifndef __NPD_COMMON_H__
#define __NPD_COMMON_H__
#include
/* opaque types for independency on used display library */
typedef struct _NPDImage NPDImage;
typedef struct _NPDColor NPDColor;
typedef struct _NPDDisplay NPDDisplay;
typedef struct _NPDPoint NPDPoint;
typedef struct _NPDBone NPDBone;
typedef struct _NPDOverlappingPoints NPDOverlappingPoints;
struct _NPDPoint
{
gfloat x;
gfloat y;
gboolean fixed;
gfloat *weight; /* pointer to weight in array of weights */
gint index;
NPDBone *current_bone;
NPDBone *reference_bone;
NPDPoint *counterpart;
NPDOverlappingPoints *overlapping_points;
};
struct _NPDBone
{
gint num_of_points;
NPDPoint *points; /* array of points */
gfloat *weights; /* array of weights */
};
struct _NPDOverlappingPoints
{
gint num_of_points;
NPDPoint *representative; /* pointer to representative of cluster */
NPDPoint **points; /* array of pointers to points */
};
typedef struct
{
gint num_of_bones;
gint num_of_overlapping_points;
gboolean ASAP; /* don't change directly!
* use npd_set_deformation_type function */
gboolean MLS_weights; /* don't change directly!
* use npd_set_deformation_type function */
gfloat MLS_weights_alpha;
NPDBone *current_bones; /* array of current bones */
NPDBone *reference_bones; /* array of reference bones */
NPDOverlappingPoints *list_of_overlapping_points; /* array of overlapping points */
} NPDHiddenModel;
typedef struct
{
NPDPoint point;
NPDOverlappingPoints *overlapping_points; /* pointer to overlapping points */
} NPDControlPoint;
typedef struct
{
gfloat control_point_radius;
gboolean control_points_visible;
gboolean mesh_visible;
gboolean texture_visible;
gint mesh_square_size;
GArray *control_points; /* GArray of control points */
NPDHiddenModel *hidden_model;
NPDImage *reference_image;
NPDDisplay *display;
} NPDModel;
#define npd_init(set_pixel, get_pixel, \
process_pixel, draw_line) \
npd_set_pixel_color = set_pixel; \
npd_get_pixel_color = get_pixel; \
npd_process_pixel = process_pixel; \
npd_draw_line = draw_line;
void npd_init_model (NPDModel *model);
void npd_destroy_model (NPDModel *model);
NPDControlPoint *npd_add_control_point (NPDModel *model,
NPDPoint *coord);
void npd_remove_control_point (NPDModel *model,
NPDControlPoint *control_point);
void npd_remove_control_points (NPDModel *model,
GList *control_points);
void npd_remove_all_control_points (NPDModel *model);
void npd_set_control_point_weight (NPDControlPoint *cp,
gfloat weight);
NPDControlPoint *npd_get_control_point_at (NPDModel *model,
NPDPoint *coord);
NPDControlPoint *npd_get_control_point_with_radius_at
(NPDModel *model,
NPDPoint *coord,
gfloat control_point_radius);
void npd_create_square (NPDBone *square,
gint x,
gint y,
gint width,
gint height);
void npd_set_point_coordinates (NPDPoint *target,
NPDPoint *source);
void npd_set_deformation_type (NPDModel *model,
gboolean ASAP,
gboolean MLS_weights);
void npd_compute_MLS_weights (NPDModel *model);
#endif /* __NPD_COMMON_H__ */