/* SPDX-FileCopyrightText: 2008 Blender Authors
 *
 * SPDX-License-Identifier: GPL-2.0-or-later */

/** \file
 * \ingroup editors
 */

#pragma once

namespace blender {

struct Object;
struct bContext;

struct TransVert {
  float *loc;
  float oldloc[3], maploc[3];
  float normal[3];
  int flag;
};

struct TransVertStore {
  TransVert *transverts;
  int transverts_tot;
  int mode;
};

/**
 * \param obedit: When `mode` has the #TM_CALC_MAPLOC flag set, `obedit` must be evaluated,
 * to access evaluated vertices.
 */
void ED_transverts_create_from_obedit(TransVertStore *tvs, const Object *obedit, int mode);
void ED_transverts_update_obedit(TransVertStore *tvs, Object *obedit);
void ED_transverts_free(TransVertStore *tvs);
bool ED_transverts_check_obedit(const Object *obedit);
bool ED_transverts_poll(bContext *C);

/* currently only used for bmesh index values */
enum {
  /** Tag to make trans verts. */
  TM_INDEX_ON = 1,
  /** Don't make verts. */
  TM_INDEX_OFF = 0,
  /** Don't make verts (when the index values point to trans-verts). */
  TM_INDEX_SKIP = -1,
};

/* mode flags: */
enum {
  /** all joints (for bones only) */
  TM_ALL_JOINTS = (1 << 0),
  /** skip handles when control point is selected (for curves only) */
  TM_SKIP_HANDLES = (1 << 1),
  /** fill in normals when available */
  TM_CALC_NORMALS = (1 << 2),
  /** Calculates #TransVert.maploc where possible. */
  TM_CALC_MAPLOC = (1 << 2),
};

enum {
  /* SELECT == (1 << 0) */
  /** Calculated when #TM_CALC_MAPLOC is set. */
  TX_VERT_USE_MAPLOC = (1 << 1),
  /** Calculated when #TM_CALC_NORMALS is set, avoid nonzero check. */
  TX_VERT_USE_NORMAL = (1 << 2),
};

}  // namespace blender
